0

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

4

3 回答 3

3

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

于 2013-02-19T20:08:55.833 回答
0
  1. 因为sys_read总是返回换行符——没有它就不会返回——我会为缓冲区分配 11 个字节并将 11 个字节放入 edx for sys_read. 您可能也想刷新缓冲区...
  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?
    

(警告未经测试的代码!)这很好而且很短,但它会转换的数字范围有限 - 对于“时间”数字很方便。我会学习div使用 C 库函数和/或学习使用 C 库函数,但如果我记忆犹新,那应该这样做。

于 2013-02-20T16:06:00.573 回答
0

如果将数字作为二进制读入内存,则需要再次从数字中提取数字,即需要将二进制转换为十进制。要在数字系统之间进行转换,您需要除以(在本例中除以 10)或使用一些特殊算法。无需除法即可将二进制转换为十进制有双重涉猎,但它可能比架构上的除法支持除法运算要慢。

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

于 2013-10-31T01:08:20.377 回答