assembly masm32加减除法和乘法

thigvfpy  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(164)
.data
msg_title db "Multiply"
A DB  4
B DB  2
C0 DB 4
C33 DB 24
C4 DB 2
C1 DB 4

buffer db 128 dup(?)
format db "(24 - A*C/4)/(2+C/A + B)= %d"
 
.code
start:

MOV AL, A
IMUL C0
IDIV C1
SUB AL, C33

MOV AL,C33 
CBW
IDIV A
MOV BL, C4
ADD BL, B
ADD AL, BL

        
MOV CL, AL      
MOV AL, BL      
CBW             

        
IDIV CL          

CBW       
CWDE      

 
invoke wsprintf, addr buffer, addr format, eax
invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK
 
invoke ExitProcess, 0
 
end start

所以答案应该是2,但是无论我改变哪一行,它总是给出0作为答案
我想我在第二个括号中的加法部分有问题

  • “移动铝,C33 *CBW *IDIV A * 移动底层,C4 * 添加底层,B * 添加铝,底层”
3xiyfsfu

3xiyfsfu1#

我看不出您的计算与格式字符串中的公式有什么关系。
由于mov al,c33覆盖AL,因此"第一个括号"中的计算是冗余的。此外,它以错误的方式进行减法。
IDIV CL可能是IDIV C1的输入错误。我没有看到CL寄存器的任何设置,但如果您将10(在AX中)除以 * C1 * 中的值4,商将为2。

    • 编辑**

修改后的代码现在使用CL执行有效的除法,但可能使用了相反的操作数。我不能判断这一点,因为我的第一个评论仍然有效!

MOV CL, AL      ; AL is 10
MOV AL, BL      ; BL is 4
CBW
IDIV CL         ; 4 / 10 produces 0

CBW``IDIV BL将除以10/4并产生2。

完全重写计算

  • 使用有意义的名称:A、B和C在你的语境中就可以了
  • 不要把每个常数都存储在内存中
  • 将2的乘方除法替换为右移
  • 一定要遵守操作的顺序,尤其是对于操作数的顺序很重要的减法运算
A db 4
B db 2
C db 4

...

mov  al, A     ; (24 - A * C / 4) -> BX
imul C
shr  ax, 2
mov  bx, 24
sub  bx, ax

mov  al, C     ; (2 + C / A + B) -> AL
cbw
idiv A
add  al, 2
add  al, B

xchg ax, bx  
idiv bl

最后的结果是20/5产生4。

相关问题