装配编号为ascii

Bew*_*ewn 3 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
Run Code Online (Sandbox Code Playgroud)

Pau*_*liL 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
Run Code Online (Sandbox Code Playgroud)


dbr*_*nk0 5

通常你可以这样做:

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)

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