我正在使用英特尔的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
Run Code Online (Sandbox Code Playgroud)
要将数字转换为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
Run Code Online (Sandbox Code Playgroud)
通常你可以这样做:
repeat
d = x MOD 10
x = x DIV 10
stringd = d + 48;
store character somewhere
until x == 0
print characters in reverse order
Run Code Online (Sandbox Code Playgroud)
但数字将从最后到第一位.将其转换为装配.