【问题标题】:Help with assembly code (convert string to int)汇编代码帮助(将字符串转换为 int)
【发布时间】:2011-08-01 17:54:44
【问题描述】:

我正在尝试在汇编中制作这个程序。 它应该只是将字符串转换为小数

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

谢谢。

【问题讨论】:

标签: assembly x86 nasm


【解决方案1】:
    mov rcx, [rbx]  ; rcx = *rbx 

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

【讨论】:

  • 我把上面那行改成了你说的,但它仍然不能工作,返回完全相同的错误结果
【解决方案2】:

已修复:

我发现程序出了什么问题=D

首先你需要检查值 10 所以

cmp rcx, 0      ; check for nul 

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

cmp rcx, 10      ; check for NL

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

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

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

【讨论】:

  • 或更一般地,检查非数字字符以停止循环!除非您不介意“123xyz\n”变成1*10^5 + 2*10^4 + 3*10^3 + ('x'-'0')*10^2 + ('y'-'0')*10 + ('z'-'0') 或其他东西。使用 movzx ecx, byte [rbx] / sub ecx, '0' / cmp ecx, 9 / ja .non_digit 将 ASCII 转换为整数和范围检查合二为一。
猜你喜欢
  • 2014-04-30
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2018-08-05
相关资源
最近更新 更多