将用户输入字符串与某些值进行比较。
在这种情况下,我想比较输入字符串与'2',如果输入是'2',则跳转到CvrtMInus
但没有任何想法发生?
例如,用户输入:
nasm -f elf64 -g inputCompare.asm
gcc -o inputCompare inputCompare.o
./inputCompare 2
sys_Exit equ 1 ;id codigos del sistema
extern printf
section .data
formatoChar: db '%c', 0AH,0
formatoDec: dq '%d', 0AH,0
formatoStr: db '%s', 0AH, 0
mayus: db "Convert MAYUS", 0AH,0
minus: db "Convert MINUS", 0AH,0
tipoCnvs: db "2",0x0A
section .bss
section .text
global main
_exit:
mov rax, 1 ; exit
mov rbx, 0 ; exit status
int 80h
main:
;Get the input data
mov rcx, rdi ; argc
mov r8, 0 ; offset
add r8, 8 ; apunta al siguiente argumento
mov rdx, qword [rsi+r8] ; argv
mov [tipoCnvs],rdx;Store value in variable
;print input
;mov rdi, formatoStr ; first parameter for printf
;mov rsi, rdx ; second parameter for printf
;mov rax, 0 ; no floating point register used
;call printf ; call to printf
;Print input value
mov rdi,formatoStr
mov rsi,[tipoCnvs]
mov rax, 0; no floating point register used
call printf
; This is the Comparison part that I'm interested in
cmp byte [tipoCnvs], '2'
je CvrtMinus
;Convierte a Mayusculas
CvrtMayus:
mov rdi,mayus
mov rax,0; no floating point register used
call printf
jmp _exit
;Convierte a Minusculas
CvrtMinus:
mov rdi,minus
mov rax,0; no floating point register used
call printf
jmp _exit
答案 0 :(得分:0)
问题是tipoCnvs
包含指向字符串的指针,因此cmp byte [tipoCnvs], '2'
比较指针的第一个字节而不是字符串。您需要将其加载到寄存器中,因为您需要另一级别的间接。例如:
mov rsi, [tipoCnvs]
cmp byte [rsi], '2'
通常的建议适用:学会使用调试器,以便修复自己的错误。
PS:使用C库时,不应直接调用exit系统调用。通常,您只需从main返回,或者如果您确实需要从C库返回call exit
。系统调用会立即终止程序,而不会让C库正常关闭。例如,您可能会丢失一些尚未从内部缓冲区刷新的输出。