帮助汇编代码(将字符串转换为int)

时间:2011-08-01 17:54:45

标签: assembly x86 nasm

我正在尝试在程序集中创建此程序。 它应该只是将字符串转换为十进制

int main (int argc, char **argv)
{
    int result = 0; 
    char *c = argv[1];  
    while(*c != 0)
    { 
        result *= 10;           
        result += (*c - 48);
        c++;    
    }
return result;
}

但没有从堆栈中获取argv ...所以我在asm中编写了一些代码,我认为应该这样做但是它不起作用。

有人能指出我做错了什么吗? 我对代码进行了评论,以便您了解我的想法,请用任何方式纠正我。

section .bss
        buf resb 8  ; define an array of 8 uninitialised bytes
section .text

global _start
_start:
    mov rax, 3  ; system call number (sys_read)
    xor rbx, rbx    ; file descriptor 0 (stdin)
    mov rcx, buf    ; buffer to store data
    mov rdx, 8  ; Lenght of buffer
    int 0x80

    xor rax,rax ; rax = 0
    mov rbx, buf    ; rbx = &buf
    xor rcx, rcx    

StrToDec:
        mov cl, [rbx]   ; cl = *rbx 
        cmp rcx, 0      ; check for nul THIS IS WRONG
        cmp rcx, 10     ; we have to check for NL ascii code 
        je end          ; if rcx == 0 goto end
        imul rax, 10    ; rax *= 10
        sub rcx, 48     ; rcx -= 48 (48 is acii for '0')
        add rax, rcx    ; rax += rcx
        inc rbx         ; rbx++
        jmp StrToDec

end:
    mov rbx, rax    ; rbx = rax
    mov rax, 1      ; rax = 1
    int 0x80

当我运行此程序并输入100时 然后键入echo $?到终端应该打印100

感谢。

2 个答案:

答案 0 :(得分:2)

    mov rcx, [rbx]  ; rcx = *rbx 

这是错误的,它从缓冲区加载八个字节。您只想加载1.使用mov cl,[rbx]movzx ecx, byte [rbx]

答案 1 :(得分:0)

FIXED:

我发现程序有什么问题= D

首先,您需要检查值10,以便

cmp rcx, 0      ; check for nul 

是错误的,因为正在寻找新行ascii代码而不是null

cmp rcx, 10      ; check for NL

是对的,如果从堆栈中获取args,我认为它不起作用,当从堆栈中获取args时,你应该检查0。

第二:对于大于255的数字,echo $?会给我错误的结果,但那没关系,因为echo $?只能显示最多255的数字,所以即使回显可能显示错误的数字,寄存器rbx也保持正确的值。

我调试了它,现在工作正常。