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