如何在程序集x86中添加数字的数字

时间:2013-02-19 20:02:56

标签: assembly x86 add digits

我正在使用汇编语言编写一个程序,它将计算客户端输入的整数位数之和。该数字总是10位数。我对集会很新,我不知道如何继续。这是我到目前为止所写的内容:

        SECTION .data

msg1:   db "Enter a number 10 digits long: "
len1:   equ $-msg1

msg2:   db "The sum of the digits is "
len2:   db $-msg2


        SECTION .bss

num:    resb 10
sum:    resb 3


        SECTION .text
        global _start

_start: nop

start:

        ;prompt for number
        mov     eax, 4
        mov     ebx, 1
        mov     ecx, msg1
        mov     edx, len1
        int     080h

        ;input number
        mov     eax, 3
        mov     ebx, 0
        mov     ecx, num
        mov     edx, 10
        int     080h

init:
        mov     esi, num
        mov     edi, sum

add_digits:

        ;loop 10 times
        ;retrieve next digit
        ;add '0' to convert to number
        ;add to sum

        ;subtract 0 to sum


        ;print results
        mov     eax, 4
        mov     ebx, 1
        mov     ecx, msg2
        mov     edx, len2
        int     080h

        mov     eax, 4
        mov     ebx, 1
        mov     ecx, sum
        mov     edx, 3
        int     080h

        ;exit
exit:
        mov     eax, 1
        mov     ebx, 0
        int     080h        

我只需要知道如何在" add_digits"中实现伪代码。另外,如果我编写了上述任何错误/错误的代码,请告诉我。非常感谢。

3 个答案:

答案 0 :(得分:2)

阅读除法AKA div指令,它如何为你提供商和余数。然后考虑检索数字的数字和除以10之间的关系。

答案 1 :(得分:0)

  1. 因为sys_read总是返回换行符 - 没有它就不会返回 - 我会为缓冲区分配11个字节,并在sys_read的edx中放置11个字节。您可能也想要刷新缓冲区......
  2. 您想减去'0'以从字符转换为数字,并添加'0'以从数字转换为字符。你的评论反过来了。
  3. 因为我们知道,根据“规范”,总和不会超过90,这将适合一个字节,可以用两个字符表示,是的,有一种方法可以避免div。 ..

    ; sum in al...
    aam ; split the byte in al into two digits in al and ah
    add ax, 3030h ; add '0' to both digits
    xchg al, ah  ; swap 'em into right order
    mov [edi], ax ; store both characters in "[sum]"
    mov byte [edi + 2], 10 ; linefeed after printing it?
    
  4. (警告未经测试的代码!)这很好而且很短,但它会转换的数字范围有限 - 方便“时间”数字。我将学会使用div和/或学习使用C库函数,但如果我的shakey内存服务,那应该这样做。

答案 2 :(得分:0)

如果您将数字作为二进制读入内存,则需要再次从数字中提取数字,即需要将二进制数转换为十进制数。要在数字系统之间进行转换,您需要除以(在这种情况下除以10)或使用一些特殊算法。有double dabble可以在没有除法的情况下从二进制转换为十进制,但也许它比结构上的除法更慢,支持除法运算。

最简单的方法是逐个读取数字并立即将其添加到总和中,或者将整个数字作为字符串读取然后添加字符