汇编数字转ASCII

3
我正在使用AT&T语法在Intel上编写汇编语言程序。
我迷失了方向,如何将寄存器中的整数转换为ASCII码?
假设我想转换数字10,并将数字10放入寄存器%eax中。 如果只是将数字48加到%eax中,则ascii符号将是一个冒号:
我想先将48加到1,然后再将48加到10中的0。 我该怎么做?
示例代码:
mov $10, %eax
#Cut the number in some way.
add $48, %eax

相关问题:https://dev59.com/wVTTa4cB1Zd3GeqPqDBa#4954659 和另一个问题:http://stackoverflow.com/questions/9113060/print-decimal-in-8086-emulator - Jens Björnhager
2个回答

9

将数字转换为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
在'push dx'这一行,你实际上是指push edx吗?我不熟悉英特尔语法,所以感到困惑。将余数edx推入堆栈似乎更合理。 - cvbattum
1
@Creator13:dxedx 的低 16 位。这段代码使用 16 位操作数大小来节省堆栈空间。(而且对于 bxcx 计数器没有任何理由。)此外,如果你只是将数据存储到缓冲区中,可以从缓冲区的末尾开始并递减指针。如果需要,稍后再复制到前面。 - Peter Cordes

5
通常你可以这样做:
repeat 
  d = x MOD 10
  x = x DIV 10
  stringd = d + 48;
  store character somewhere
until x == 0
print characters in reverse order

但数字将从后往前排列。请将其转换为汇编语言。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接