在使用ATOI在汇编中将字符串转换为整数时出现问题

时间:2015-05-12 02:07:22

标签: c assembly nasm intel atoi

我正在尝试读取两个字符串,使用atoi函数将它们转换为数字,然后打印出结果。

这是我未初始化的变量。 (%定义BUFLEN 20)

SECTION .bss                    ; uninitialized data section

m:           resb BUFLEN             ;STRING 1
mlen:        resb 4
r:           resb BUFLEN             ;STRING 2
rlen:        resb 4

这是我获得用户输入/尝试将其分配到内存

的地方
   ; prompt user for FIRST NUMBER

    mov     eax, SYSCALL_WRITE      ; write function
    mov     ebx, STDOUT             ; Arg1: file descriptor
    mov     ecx, msg1               ; Arg2: addr of message
    mov     edx, len1               ; Arg3: length of message
    int     080h                    ; ask kernel to write


    ; read in user input
    ;
    mov     eax, SYSCALL_READ       ; read function
    mov     ebx, STDIN              ; Arg 1: file descriptor
    mov     ecx, m                  ; Arg 2: address of buffer
    mov     edx, BUFLEN                  ; Arg 3: buffer length
    int     080h
    mov     [rlen], eax             ; save length of string read

    ; prompt user for SECOND NUMBER

    mov     eax, SYSCALL_WRITE      ; write function
    mov     ebx, STDOUT             ; Arg1: file descriptor
    mov     ecx, msg2               ; Arg2: addr of message
    mov     edx, len2               ; Arg3: length of message
    int     080h                    ; ask kernel to write

    ; read in user input
    mov     eax, SYSCALL_READ       ; read function
    mov     ebx, STDIN              ; source
    mov     ecx, r                  ; destination
    mov     edx, BUFLEN                  ; length of destination
    int     080h              
    mov     [mlen], eax             ; save length of string read

现在我正在尝试使用atoi转换字符串并打印出来

    ;CONVERT TO #
    mov     eax, 0                  ;zero out register
    mov     eax, m
    call    atoi
    add     esp, 4

    ;PRINT IT
    push    ax
    push    print_r
    call    printf
    add     esp, 8

    ;CONVERT TO #
    mov     eax, 0                  ;zero out register
    mov     eax, r
    call    atoi
    add     esp, 4

    ;PRINT IT
    push    ax
    push    print_r
    call    printf
    add     esp, 8

这是我的输出......

先输入#:1234

输入第二个#:1234

编号:1234

挂在第二个atoi电话

1 个答案:

答案 0 :(得分:1)

首先,你没有为输入分配足够的空间而你没有正确阅读它。

如果输入字符串12345678,则字符需要8个字节,新行需要1个字节,终止\0需要1个字节。因此,RESD 1不会削减芥末,它只会给你八个字节而不是十个字节。

实际阅读信息:

mov     eax, SYSCALL_READ       ; read function
mov     ebx, STDIN              ; Arg 1: file descriptor
mov     ecx, m                  ; Arg 2: address of buffer
mov     edx, 1                  ; Arg 3: buffer length
int     080h

edx意味着要读取的字节数,并且由于某种原因您将其设置为1。这不会得到你的全部数字,而只是得到第一个数字的第一个字符。

除了输入问题之外,还有一些问题。

首先,声明:     mov eax,[m] 获取m内存的内容。如果您正在呼叫atoi,则需要该地址。

其次,您需要检查您的调用约定。向esp添加值似乎对我来说非常不寻常。 可能是正确的,但它似乎与我见过的任何调用约定都不匹配。