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

Veröffentlicht am: 18 Januar 2026
auf dem Kanal: 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


Auf dieser Seite können Sie das Online-Video Building a Command Table in Assembly | Beginner Tutorial | x86-64 Assembly Programming Course mit der Dauer stunde minuten sekunde in guter Qualität ansehen, das der Benutzer Mxy 18 Januar 2026 hochgeladen hat, den Link mit Freunden und Bekannten teilen, dieses Video wurde auf Youtube bereits 1,879 Mal angesehen und es wurde von 92 den Zuschauern gefallen. Viel Spaß beim Betrachtenden Zuschauern gefallen!