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

问题描述 投票:0回答:3

我正在使用汇编语言编写一个程序,它将计算将由客户端输入的整数的总和。该数字总是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”中实现伪代码。另外,如果我编写了上述任何错误/错误的代码,请告诉我。非常感激。

assembly x86 add digits
3个回答
2
投票

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


0
投票

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

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


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

(警告未经测试的代码!)这很好而且很短,但是它将转换的数字范围有限 - 方便“时间”数字。我将学习使用'0'和/或学习使用C库函数,但如果我的shakey内存服务,那应该这样做。

© www.soinside.com 2019 - 2024. All rights reserved.