Loops NASM:将多字符输入转换为十进制
我试图写一个程序,得到一个数字与一个或两个数字,并写你好!是那个数字的两倍 我用这些帖子来写我的代码: 我不明白这一点: 但是我的代码只对两位数有效,而对一位数的结果是错误的 我的代码:Loops NASM:将多字符输入转换为十进制,loops,assembly,x86,nasm,Loops,Assembly,X86,Nasm,我试图写一个程序,得到一个数字与一个或两个数字,并写你好!是那个数字的两倍 我用这些帖子来写我的代码: 我不明白这一点: 但是我的代码只对两位数有效,而对一位数的结果是错误的 我的代码: section .data msg db 'Hello!',0xA len equ $-msg section .bss n resb 2 section .text global _start _start: ;get n mov edx, 2 m
section .data
msg db 'Hello!',0xA
len equ $-msg
section .bss
n resb 2
section .text
global _start
_start:
;get n
mov edx, 2
mov ecx, n
mov ebx, 0
mov eax, 3
int 0x80
lea esi,[n] ;address of our text
call toint
;loop for print 'Hello!\n'
print_loop:
push ecx
mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80
pop ecx
loop print_loop
mov eax, 1
int 0x80
toint:
push eax
push ebx
xor ebx, ebx
next_digit:
movzx eax, byte[esi]
sub al , '0'
imul ebx, 10
add ebx, eax
inc esi
cmp byte [esi] , 0x0 ;check next character is null or not
jne next_digit
; end_loop:
mov ecx, ebx
pop eax
pop ebx
ret
sys_read调用在EAX中返回发送到inputbuffer的字符数。由于允许输入最多2个字符,因此此计数将为0、1或2。您可以在toint例程中使用此信息
请注意,在堆栈上保留/恢复寄存器时,需要遵守相反的顺序!你的代码漏掉了这个
四点提示
a。首选MOV变量来加载地址。它总是一个简短的指令。
B防止输入为零。
C不要使用循环。这是一个缓慢的指令。
D提供退出代码以终止程序
mov esi, n ; (a)
call toint ; -> ECX
jecxz Exit ; (b)
print_loop:
...
dec ecx ; (c)
jnz print_loop
Exit:
xor ebx, ebx ; (d)
mov eax, 1
int 0x80
对于单个数字,您的输入将包括行尾字符,因为缓冲区中有足够的空间。无论如何,您都不应该检查零终止符,因为您没有添加任何终止符。让你的缓冲区足够大,以达到最大大小和换行,然后检查。为了完全安全,还要检查read的返回值。@Jester谢谢。它起作用了。这是非常重要的一点:
mov esi, n ; (a)
call toint ; -> ECX
jecxz Exit ; (b)
print_loop:
...
dec ecx ; (c)
jnz print_loop
Exit:
xor ebx, ebx ; (d)
mov eax, 1
int 0x80