Я написал простую программу сборки, которая читает с клавиатуры два байта. Программа сравнивает байты и выводит их, которые больше или равны, если они равны.
Я использую 64-битную машину с 8-байтовыми регистрами, и я считаю, что память также имеет ширину 8 байт.
Мой вопрос: как мне использовать 8 бит в регистре, а не все 64 бита? В настоящее время, чтобы выполнить то, что я хочу, мне нужно очистить все 64 бита в регистре с помощью инструкции xor rax, rax
или mov rax, 0
. Было бы проще, если бы я мог просто загрузить 8 бит, которые я хочу сравнить, и выполнить мою sub
операцию с этими 8 битами.
global _start
section .text
_start:
push 0
mov rbp,rsp
sub rsp,0x10
;Clear out contents
xor rax,rax
mov [rbp-0x8],rax
mov [rbp-0x10],rax
push intro
push 0x42
call print
mov rax, 0
mov rdi, 0
lea rsi, [rbp-0x8]
mov rdx, 2
syscall
mov rax, 0
mov rdi, 0
lea rsi, [rbp-0x10]
mov rdx, 2
syscall
mov rax, [rbp-0x8]
mov rbx, [rbp-0x10]
sub rax,rbx
je equal
jg firstlarger
jl secondlarger
equal:
push equalmessage
push 0xfg
call print
jmp exit
firstlarger:
push first
push 0x10
call print
jmp exit
secondlarger:
push second
push 0x11
call print
jmp exit
exit:
mov rax,60
xor rdi,rdi
syscall
print:
push rbp
mov rbp,rsp
sub rsp,0x0
mov rax,1
mov rdi,1
mov rsi, [rbp+0x18]
mov rdx, [rbp+0x10]
syscall
leave
ret 0x10
section .data
intro: db "Please enter 1 character, hit enter, then another, then hit enter", 10
equalmessage: db "They are equal",10
first: db "First is larger",10
second: db "Second is larger",10