Сравнение меньших регистров в ассемблерном коде - PullRequest
0 голосов
/ 07 мая 2018

Я написал простую программу сборки, которая читает с клавиатуры два байта. Программа сравнивает байты и выводит их, которые больше или равны, если они равны.

Я использую 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
...