返回数字偶数位之和的汇编代码

问题描述 投票:0回答:1
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,我不知道真的不知道如何解决这个错误

loops assembly x86-64 nasm number-formatting
1个回答
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

您当前输出的结果并不反映正在进行的计算:

  • 您忘记更新 sum 变量,因此只有最后一位数字才能(在某种程度上)得到结果。最好的解决方案根本不需要使用 sum 变量。见下文。
  • 循环很可能运行太长时间,因为循环结束条件是
    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
© www.soinside.com 2019 - 2024. All rights reserved.