[英]Trouble with converting string to integer using ATOI In Assembly
我试图读取两个字符串,使用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电话上
首先,您没有为输入分配足够的空间, 并且没有正确读取它。
如果输入字符串12345678
,则需要八个字节的字符,一个字节用于换行,一个字节用于终止\\0
。 因此, 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
增加价值似乎非常……对我而言很不寻常。 可能是正确的,但似乎与我见过的任何调用约定都不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.