装配编号为ascii

时间:2012-02-02 14:11:08

标签: assembly intel

我正在使用英特尔的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

2 个答案:

答案 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

但数字将从最后到第一位。将其转换为装配。