【问题标题】:Trouble with converting string to integer using ATOI In Assembly使用 ATOI In Assembly 将字符串转换为整数的问题
【发布时间】:2015-05-12 02:07:22
【问题描述】:

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

这是我未初始化的变量。 (%define 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 通话

【问题讨论】:

  • 你肯定不想push ax!

标签: c assembly nasm intel atoi


【解决方案1】:

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

如果输入字符串12345678,则字符需要8 个字节,换行符需要1 个字节,结尾\0 需要1 个字节。所以,RESD 1 不会减少芥末,它只会给你 8 个字节而不是 10 个。

对于实际阅读信息:

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。这不会得到你的整个数字,而只会得到第一个数字的第一个字符。

除了输入问题之外,还有几个问题。

首先声明: 移动 eax, [m] 在m 处获取内存的内容。如果你打电话给atoi,它会需要地址本身。

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

【讨论】:

  • 它正在正确打印出第一个转换后的字符串,但现在挂在第二个 atoi 调用上。希望我能从这里弄清楚,谢谢。
  • 此外,它仅在使用 4 位或更少的数字作为输入时才能正确打印,我需要它以便我可以输入 8 位数字。
  • @tdwig,这实际上是一个不同的问题。 SO 的机制是问答(对问题有非常具体的答案)而不是讨论板(讨论与原始问题相关但不是核心的各个方面),因此如果您只是发布一个新的答案,您将获得更广泛的答案问题(如果您愿意,可以参考这个问题)。
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2011-03-26
  • 2020-08-21
  • 1970-01-01
相关资源
最近更新 更多