我正在使用汇编语言编写一个程序,它将计算将由客户端输入的整数的总和。该数字总是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”中实现伪代码。另外,如果我编写了上述任何错误/错误的代码,请告诉我。非常感激。
阅读除法AKA div
指令,它如何为你提供商和余数。然后考虑检索数字的数字和除以10之间的关系。
如果您将数字作为二进制读入内存,则需要再次从数字中提取数字,即需要从二进制转换为十进制。要在数字系统之间进行转换,您需要除以(在这种情况下除以10)或使用一些特殊算法。 double dabble可以在没有除法的情况下从二进制转换为十进制,但也许它比架构上的除法更慢,支持除法运算。
最简单的方法是逐个读取数字并立即将其添加到总和中,或者将整数读取为字符串然后添加字符
sys_read
总是返回换行符 - 没有它就不会返回 - 我会为缓冲区分配11个字节,并在edx中为jazxswpoi放置11个字节。您可能也想要刷新缓冲区...sys_read
...
'0'
(警告未经测试的代码!)这很好而且很短,但是它将转换的数字范围有限 - 方便“时间”数字。我将学习使用'0'
和/或学习使用C库函数,但如果我的shakey内存服务,那应该这样做。