比较用户输入的字符 x86_64 程序集

Compare User Entered Character x86_64 Assembly

我正在尝试比较用户输入的字符 (A - E) 和 运行 特定标签是否相等。但是,它似乎没有正确比较,运行宁我的默认失败标签。它成功地获得了输入,但似乎 cmp 没有正常工作。下面是我的代码:

section .data
    ; constants
    NULL        equ 0
    EXIT_SUCCESS    equ 0
    EXIT_FAIL   equ 1
    SYS_exit    equ 60
    SYS_read    equ 0
    SYS_write   equ 1
    STD_in      equ 0
    STD_out     equ 1
    lA      equ "A"
    lB      equ "B"
    lC      equ "C"
    lD      equ "D"
    lE      equ "E"
    
    ; other
    text1   db "Please enter an upper-case letter from A-E: "
    errmsg  db "Error: incorrect letter chosen."
    sucmsg  db "Success."

section .bss
    ; reserve space for user input
    letter resb 1

section .text
    global _start
    
_start: 
    
    ; print question
    ; sys_write (1, text, 43)
    mov rax, SYS_write
    mov rdi, STD_out
    mov rsi, text1
    mov rdx, 43
    syscall
    
    ; get user input
    ; sys_read (0, letter, 1)
    mov rax, SYS_read
    mov rdi, STD_in
    mov rsi, letter
    mov rdx, 1
    syscall
    
    ; jump conditionals
    mov rdx, lA
    cmp rsi, rdx
    je _printA
    
    mov rdx, lB
    cmp rsi, rdx
    je _printB
    
    mov rdx, lC
    cmp rsi, rdx
    je _printC
    
    mov rdx, lD
    cmp rsi, rdx
    je _printD
    
    mov rdx, lE
    cmp rsi, rdx
    je _printE
    
    ; default jump if no match
    jmp _exitFail
    
_printA:
    ; sys_write (1, text, 1)
    mov rax, SYS_write
    mov rdi, STD_out
    ; mov rsi, "A"
    mov rdx, 1
    syscall
    
    jmp _exitSuccess

_printB:    
    ; sys_write (1, text, 1)
    mov rax, SYS_write
    mov rdi, STD_out
    ; mov rsi, "B"
    mov rdx, 1
    syscall
    
    jmp _exitSuccess
    
_printC:
    ; sys_write (1, text, 1)
    mov rax, SYS_write
    mov rdi, STD_out
    ; mov rsi, "C"
    mov rdx, 1
    syscall
    
    jmp _exitSuccess

_printD:
    ; sys_write (1, text, 1)
    mov rax, SYS_write
    mov rdi, STD_out
    ; mov rsi, "D"
    mov rdx, 1
    syscall
    
    jmp _exitSuccess

_printE:
    ; sys_write (1, text, 1)
    mov rax, SYS_write
    mov rdi, STD_out
    ; mov rsi, "E"
    mov rdx, 1
    syscall
    
    jmp _exitSuccess
    
_exitSuccess:
    ; print success msg
    ; sys_write (1, errmsg, 8)
    mov rax, SYS_write
    mov rdi, STD_out
    mov rsi, sucmsg
    mov rdx, 8
    syscall
    
    ; sys_exit (0)
    mov rax, SYS_exit
    mov rdi, EXIT_SUCCESS
    syscall
    
_exitFail:
    ; print fail msg
    ; sys_write (1, errmsg, 31)
    mov rax, SYS_write
    mov rdi, STD_out
    mov rsi, errmsg
    mov rdx, 31
    syscall
    
    ; sys_exit (1)
    mov rax, SYS_exit
    mov rdi, EXIT_FAIL
    syscall

syscall SYS_read 之前,您已正确加载地址为 letter 的 RSI。 在 ; jump conditionals 处,您将 RDX 中的 lettersletter 中的 address 进行比较,后者保留在 RSI 中。
跳转条件 MOVZX RSI,[byte letter].

之前取消引用 RSI

或者直接使用

CMP  byte [byte letter],'A'
JE   _printA
CMP  byte [byte letter],'B'
JE   _printB
... etc

或者,如果您想避免跳转(出于性能原因),请在 数组 中创建指向 _printA_printB 等的 QWORD 指针=18=],将得到的字母A,B,C,D,E转换为数值索引0,1,2,3,4在 RSI 中而不是 跳转条件 使用一次跳转 JMP [qword array+8*RSI].