Nasm汇编程序x64比较输入字符串

时间:2014-06-02 23:41:33

标签: string assembly comparison nasm x86-64

将用户输入字符串与某些值进行比较。

在这种情况下,我想比较输入字符串与'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

1 个答案:

答案 0 :(得分:0)

问题是tipoCnvs包含指向字符串的指针,因此cmp byte [tipoCnvs], '2'比较指针的第一个字节而不是字符串。您需要将其加载到寄存器中,因为您需要另一级别的间接。例如:

mov rsi, [tipoCnvs]
cmp byte [rsi], '2'

通常的建议适用:学会使用调试器,以便修复自己的错误。

PS:使用C库时,不应直接调用exit系统调用。通常,您只需从main返回,或者如果您确实需要从C库返回call exit。系统调用会立即终止程序,而不会让C库正常关闭。例如,您可能会丢失一些尚未从内部缓冲区刷新的输出。