我正在尝试读取两个字符串,使用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电话
答案 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
添加值似乎对我来说非常不寻常。 可能是正确的,但它似乎与我见过的任何调用约定都不匹配。