【发布时间】:2014-10-20 15:56:59
【问题描述】:
我正在编写这个小程序,你输入一个被除数和一个除数,程序将输出商和余数。代码如下:
segment .data
prompt db "Please enter a number: ", 10
promptLen equ $-prompt
prompt2 db "Please enter the divisor: ", 10
prompt2Len equ $-prompt2
prompt3 db "Your quotient is: ",10
prompt3Len equ $-prompt3
prompt4 db "Your remainder is: ",10
prompt4Len equ $-prompt4
segment .bss
inputNum resb 2
inputDiv resb 2
quotient resb 2
remainder resb 2
segment .text
global _start
_start:
mov eax, 4
mov ebx, 1
mov ecx, prompt
mov edx, promptLen
int 80h
mov eax, 3
mov ebx, 0
mov ecx, inputNum
mov edx, 2
int 80h
mov eax, 4
mov ebx, 1
mov ecx, prompt2
mov edx, prompt2Len
int 80h
mov eax, 3
mov ebx, 0
mov ecx, inputDiv
mov edx, 2
int 80h
xor edx, edx
mov ax, [inputNum]
mov bx, [inputDiv]
and ax, 0xff
and bx, 0xff
sub ax, '0'
sub bx, '0'
div bx
add ax, '0'
add dx, '0'
mov [quotient], ax
mov [remainder], dx
mov eax, 4
mov ebx, 1
mov ecx, prompt3
mov edx, prompt3Len
int 80h
mov eax, 4
mov ebx, 1
mov ecx, quotient
mov edx, 2
int 80h
mov eax, 4
mov ebx, 1
mov ecx, prompt4
mov edx, prompt4Len
int 80h
mov eax, 4
mov ebx, 1
mov ecx, remainder
mov edx, 2
int 80h
jmp exit
exit:
mov eax, 1
xor ebx, ebx
int 80h
现在的代码方式,我只能处理一个字符的数字;通过减去“0”并将其重新添加到输出中。 谁能帮我用一种更有效的方式进行这种转换,这样我就不会被限制在只有一个字符的数字上?
【问题讨论】:
-
你关心效率还是正确性?
-
如果您不能使用 libc,您将不得不编写自己的转换例程。身边的例子很多。您可以 multiply each digit by 10 in a loop 进行文本转二进制,并在循环中除以 10 进行二进制转文本。
-
如果您对代码的每一行进行注释,将会有很大帮助。
-
@User.1: 或者其中任何一个:)
-
@ScottHunter,我确实关心效率和正确性!
标签: assembly ascii nasm data-conversion