比较用户输入的字符 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 中的 letters 与 letter
中的 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]
.
我正在尝试比较用户输入的字符 (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 中的 letters 与 letter
中的 address 进行比较,后者保留在 RSI 中。
在 跳转条件 和 MOVZX RSI,[byte letter]
.
或者直接使用
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]
.