global main
section .data
msgeven db "The sum of the even digits in the number is:",0
sum db 0
uc db 0
c db 0
num db 234
section .text
main:
mov ax,[num]
_calculatesum:
cmp ax,'0'
je calculate_sum_done
mov r8b,10
div r8b
mov [uc],ah
mov[c],al
xor ebx,ebx
mov bl,[uc]
test bl,1
jnz _skip_odd_digit
mov cl,[sum]
add cl,bl
_skip_odd_digit:
jmp _calculatesum
calculate_sum_done:
add cl,'0'
mov [sum],cl
mov rax,1
mov rdi,1
mov rsi,msgeven
mov rdx,50
syscall
mov rax,1
mov rdi,1
mov rsi,sum
mov rdx,1
syscall
mov rax,60
mov rdi,0
syscall
我有这个汇编代码,应该返回 num 中偶数位的总和,在本例中为 6,但是尽管我可以运行该程序,但我得到了这个数字中偶数位的总和是:00�0,我不知道真的不知道如何解决这个错误
The sum of the even digits in the number is:00�0
您在屏幕上打印了太多字符。 msgeven 文本有 44 个字符,因此您不应在系统调用中使用
mov rdx,50
。解决这个问题:
msgeven db "The sum of the even digits in the number is:"
length equ $ - msgeven
...
mov edx, length
syscall
您当前输出的结果并不反映正在进行的计算:
cmp ax,'0'
,与 cmp ax, 48
相同,并且根本不需要测试零。mov ax,[num]
上字节大小变量的大小错误可能是无害的,因为它会在 AH 中加载零。num db 234
msgeven db "The sum of the even digits in the number is: "
result db "??"
length equ $ - msgeven
...
movzx eax, byte [num]
mov ebx, 10 ; CONST divider
xor ecx, ecx ; Result
.CalculateSum:
xor edx, edx
div ebx ; EDX:EAX / EBX --> EAX is quotient
test dl, 1 ; --> EDX is remainder
jnz .SkipOddDigit
add ecx, edx
.SkipOddDigit:
test eax, eax
jnz .CalculateSum
对于测试用例编号 234,结果是 6,这只是一个字符,因此添加“0”就足够了。然而,您可以预期的最大结果是来自测试用例编号 248 的 2 字符编号 14。
mov eax, ' '
cmp cl, 10
jb .OneChar
add eax, 17 ; -> AL='1'
sub ecx, 10
.OneChar:
mov [result], al
add cl, '0'
mov [result + 1], cl
mov edx, length
mov rsi, msgeven
mov edi, 1
mov eax, 1
syscall