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



我正在尝试比较用户输入的字符(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中的字母letter的<strong]地址>进行比较,后者仍处于RSI中
跳转条件之前取消引用RSI,使用MOVZX RSI,[byte letter]

或者简单地使用

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

或者,如果您想避免跳转(出于性能原因(,请在SECTION .data中创建一个指向_printA_printB等的QWORD指针的数组,将获得的字母A、B、C、D、E转换为RSI中的数字索引0、1、2、3、4并使用一个跳转JMP [qword array+8*RSI]来代替跳转条件。

最新更新