Building a Command Table in Assembly | Beginner Tutorial | x86-64 Assembly Programming Course

Pubblicato il: 18 gennaio 2026
sul canale di: Mxy
1,879
92

Watch the course from the beginning:    • Learn Assembly For Beginners | Introductio...  
Previous Video in Course:    • Objects in Assembly | Beginner Tutorial | ...  
Follow along with me in the x64Playground: https://x64.halb.it (Select GNU as the Assembler!)

CODE TO COPY/PASTE:

;###############
;# CODE START
;##################
.intel_syntax noprefix
.global _start
.text
_start:

lea rdi, [buf]
lea rsi, [bufsize]
call readline
cmp rax, 0
je _start


lea rdi, [buf]
lea rsi, [tokens]
call tokenize

lea rdi, [tokens]
mov rdi, [rdi]
lea rsi, [s_cmd_exit]
call strcmp ;# rax == 0 if strings match
je exit

lea rdi, [tokens]
mov rdi, [rdi]
lea rsi, [s_cmd_echo]
call strcmp
je select.echo

lea rdi, [tokens]
mov rdi, [rdi]
lea rsi, [s_cmd_help]
call strcmp
je select.help

lea rdi, [s_nocommand]
call println

jmp _start

select.help:
call help
jmp _start


select.echo:
lea rdi, [tokens + 8]

call echo
jmp _start

help:
lea rdi, [s_help]
call print
ret

echo:
mov r15, rdi

echo.loop:
mov rdi, [r15]
cmp rdi, 0
je echo.ret
call print

lea rdi, [space]
call print

add r15, 8
jmp echo.loop

echo.ret:
lea rdi, [newline]
call print
ret

strcmp: ;# args: rdi s1, rsi s2
xor rax, rax
mov al, [rdi]
mov dl, [rsi]
cmp al, dl
jne sc.done
cmp al, 0
je sc.done

inc rdi
inc rsi
jmp strcmp

sc.done:
sub al, dl
ret

strncmp: ;# args: rdi s1, rsi s2, rdx len
mov rcx, rdx
snc.loop:
dec rcx
mov al, [rdi]
mov dl, [rsi]
cmp al, dl
jne snc.done
cmp al, 0
je snc.done
cmp rcx, 0
je snc.done

inc rdi
inc rsi
jmp snc.loop

snc.done:
sub al, dl
ret

nodata:
lea rdi, [s_nodata]
call print
call exit

print_tokens:
lea r15, [tokens]

pt.loop:
mov rdi, [r15]
cmp rdi, 0
je pt.end

call println
add r15, 8
jmp pt.loop

pt.end:
ret

tokenize: ;# arg1: rdi (string), arg2: rsi (arr)
mov r15, rsi

tokenize.loop:
call skipwhite
cmp byte ptr [rdi], 0x0
je tokenize.end

mov [r15], rdi
add r15, 8
call findend
cmp byte ptr [rdi], 0
je tokenize.end

mov byte ptr [rdi], 0
inc rdi
jmp tokenize.loop

tokenize.end:
mov qword ptr [r15], 0
ret

findend:
cmp byte ptr [rdi], ' '
je findend.ret

cmp byte ptr [rdi], 0
je findend.ret

inc rdi
jmp findend

findend.ret:
ret

skipwhite:
cmp byte ptr [rdi], ' '
je skipwhite.advance

ret


skipwhite.advance:
inc rdi
jmp skipwhite

exit:
xor rdi, rdi
mov rax, 60
syscall

print:
push rdi
call slen
pop rsi
mov rdx, rax
mov rax, 1
mov rdi, 1
syscall
ret

println:
push rdi
call slen
pop rsi
mov rdx, rax
mov rax, 1
mov rdi, 1
syscall

mov rax, 1
mov rdi, 1
lea rsi, [newline]
mov rdx, 1
syscall
ret

slen:
xor rcx, rcx

slen.loop:
mov al, [rdi + rcx]
cmp al, 0
je slen.ret
inc rcx
jmp slen.loop

slen.ret:
mov rax, rcx
ret

readline:
lea rdx, [rsi - 1]
mov rsi, rdi
mov rax, 0
mov rdi, 0
syscall

mov byte ptr [rsi + rax], 0
ret

memview:
mov r14, rsp
lea rsp, [buf]
int3
mov rsp, r14
ret

.data
buf: .skip 128, 0xaa
bufsize = . - buf
tokens: .skip 128, 0xbb
newline: .asciz "\n"
space: .asciz " "
s_nodata: .asciz "\nNo data entered!\n"
s_nocommand: .asciz "\nUnsupported command!\n"
s_cmd_exit: .asciz "exit"
s_cmd_echo: .asciz "echo"
s_cmd_help: .asciz "help"
s_help: .asciz "\nSupported commands:\n1 echo\n2 exit\n3 help (this function)\n"
;#########
;# CODE END
;#########

00:00 our tiny shell
1:00 parsed input
02:14 making our command table
03:18 visual look at our array
04:11 adding our loop
06:35 incrementing per element
07:05 selecting the function pointer member


In questa pagina del sito puoi guardare il video online Building a Command Table in Assembly | Beginner Tutorial | x86-64 Assembly Programming Course della durata di ore minuti seconda in buona qualità , che l'utente ha caricato Mxy 18 gennaio 2026, condividi il link con amici e conoscenti, su youtube questo video è già stato visto 1,879 volte e gli è piaciuto 92 spettatori. Buona visione!