assembly 这个作业要求我做什么,关于对一个值0425h的数字求和?

ar5n3qh5  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个装配问题,其中:给定寄存器AX=0425h。编写一个程序,将值为0425h的位数之和相加,并将其存储在同一个寄存器AX中。我不知道该在其中做什么。有人能帮我解决这个问题吗?
我试着想一个解决办法,没有发现任何东西:)

kzipqqlq

kzipqqlq1#

给定寄存器AX=0425h
这个十六进制数的位数是0、4、2和5。赋值语句要求您将这些数字相加,得到0 + 4 + 2 + 5 = 11。
一种可能的解决方案如下:

mov  edx, eax      ;        -> DH=04h  AL=25h
aam  16            ; 25h/16 -> AH=2  AL=5
add  al, ah        ; (5+2)  -> AL=7
xchg al, dh        ;        -> DH=7  AL=04h
aam  16            ; 04h/16 -> AH=0  AL=4
add  al, ah        ; (4+0)  -> AL=4
add  al, dh        ; (4+7)  -> AL=11
cbw                ;        -> AX=11

该代码适用于任何值AX=[0000h,FFFFh],生成AX=[0,60]。
使用循环的解决方案,可以处理任何值EAX=[00000000h,FFFFFFFFh],生成EAX=[0,120]:

xor  ecx, ecx   ; TempResult = 0
More:
  mov  ebx, eax   ; Copy to another temporary register where
  and  ebx, 15    ;   we only keep the lowest digit
  add  ecx, ebx   ; TempResult + LowestDigit
  shr  eax, 4     ; Shift the original digits to the right discarding the one(s) we already added to the TempResult
  jnz  More       ; Only looping if more non-zero digits exist
  mov  eax, ecx   ; EAX = TempResult

相关问题