我写了一段代码,从提示符中取一个ASCII字符的数字,将其转换为十进制数字并将其存储在' dnumber'中。转换已经过检查并且运行良好。它在提示时出错了。它在向用户询问ASCII字符编号时似乎陷入了无限循环。当用户按下ENTER时,我希望程序停止询问输入,但即使我认为我已经设置了那个终止值,也似乎没有达到终止值。
我最近在这个论坛上问了两个相关的问题,结果表明我不能正确理解系统调用。我已阅读了关于' http://www.tutorialspoint.com/assembly_programming',' http://cs.lmu.edu/~ray/notes/nasmtutorial/'的所有文档。和一些' http://www.x86-64.org/documentation/abi.pdf'而且显然我还没有得到它。希望你能告诉我光明。
以下是编译器信息:
nasm -f elf64 convinput.asm
ld -s -o convinput convinput.o
以下是提示:
$ ./convinput
Enter a number and press enter:
123
123
123
正如您所看到的,我已按两次ENTER,但提示仍然要求输入。
以下是代码:
section .text
global _start
_start:
mov eax, 4
mov ebx, 1
mov edx, lenmsg1
mov ecx, msg1
int 80h
xor eax, eax
xor ebx, ebx
xor edx, edx
mov esi, data
call input
mov esi, data
movzx ecx, byte [dignum]
xor ebx,ebx ; clear ebx
call string_to_int
mov dword [dnumber], eax
mov eax, 1
mov ebx, 0
int 80h
input:
mov eax, 3
mov ebx, 0
mov ecx, esi
mov edx, 1
int 80h
inc byte [dignum]
cmp byte [esi], 13
inc esi
jne input
ret
string_to_int:
xor ebx,ebx
movzx eax, byte [esi]
inc esi
sub al,'0' ; convert from ASCII to number4
mov ebx, 10
mul ebx
add ebx,eax ; ebx = ebx*10 + eax
dec byte [dignum]
cmp byte [dignum], 0
jne string_to_int
mov eax,ebx
ret
section .bss
dignum resb 1
data resb 1000
dnumber resd 1
section .data
msg1 db 'Enter a number and press enter: ', 10, 0
lenmsg1 equ $ -msg1
; ESI = pointer to the string to convert
; ECX = number of digits in the string (must be > 0)
; Output:
; EAX = integer valu
答案 0 :(得分:0)
根据你放入eax的值来判断你使用的是32位系统调用表,它在linux上与64位不同。
您可以通过在strace下运行程序轻松查看调用的系统调用(以及使用哪些参数)。