我正在使用英特尔的at& t语法处理汇编程序。
我输了,如何将寄存器中的整数转换为ascii数字?
假设我想转换数字10,我会将数字10放在寄存器%eax中。 如果我只是将数字48添加到%eax,则ascii符号将为:
我想在1中添加48,然后在数字10中添加48到0。 我怎么能这样做?
示例代码:
mov $10, %eax
#Cut the number in some way.
add $48, %eax
答案 0 :(得分:6)
要将数字转换为ASCII,您需要将数字除以10并使用余数作为结果。然后添加ASCII“0”并存储结果数字。然后用商重复相同,直到它达到零。
然而,这从最低有效数字开始以相反的顺序给出数字。您可以通过使用堆栈来反转订单。将每个数字推入堆栈,然后弹出它们并存储到字符串缓冲区中。
像这样(未经测试):
.DATA
strResult db 16 dup (0) ; string buffer to store results
.CODE
mov eax, number ; number to be converted
mov ecx, 10 ; divisor
xor bx, bx ; count digits
divide:
xor edx, edx ; high part = 0
div ecx ; eax = edx:eax/ecx, edx = remainder
push dx ; DL is a digit in range [0..9]
inc bx ; count digits
test eax, eax ; EAX is 0?
jnz divide ; no, continue
; POP digits from stack in reverse order
mov cx, bx ; number of digits
lea si, strResult ; DS:SI points to string buffer
next_digit:
pop ax
add al, '0' ; convert to ASCII
mov [si], al ; write it to the buffer
inc si
loop next_digit
答案 1 :(得分:5)
通常你可以这样做:
repeat
d = x MOD 10
x = x DIV 10
stringd = d + 48;
store character somewhere
until x == 0
print characters in reverse order
但数字将从最后到第一位。将其转换为装配。