我正在尝试解决表达式:7 * (4 + 10) + (15 / 5) 例如在汇编语言中。我假设 BEDMAS 原则仍然适用,但我运行的代码没有给我正确的数值。
我不确定我哪里出错了。当我们调用
DIV
时,它不会自动除以 AX
寄存器中的值吗?
MOV BX,10
ADD BX,4
MOV AX,15
MOV BL,5
DIV BL
ADD AX,BX
MOV BX, 7
MUL BX
HLT
MOV BX,10 ADD BX,4 MOV AX,15 MOV BL,5 <<<< This overwrites the sum 10 + 4 in BX DIV BL ADD AX,BX <<<< Luckily remainder in AH was zero MOV BX, 7 MUL BX <<<< Needlessly clobbers DX
除了一些其他“缺陷”之外,此计算不遵循正常的代数规则。
您已计算出 7 * ( (4 + 10) + (15 / 5) ),而任务要求 ( 7 * (4 + 10) ) + (15 / 5)
AL
中产生商,但也会在 AH
中产生余数。此任务要求您继续计算商并忽略余数。您的代码没有明确地将零AH
归零,这对于通用解决方案来说还不够好!幸运的是 15 / 5 给出余数 = 0.先除后乘的解法:
mov ax, 15
mov bl, 5 ;Divider in BL
div bl ;AX/BL -> AL=3 (remainder in AH=0)
mov bl, al ;Move to an extra register
mov al, 4
add al, 10 ;AL=14
mov ah, 7
mul ah ;AL*AH -> AX=98
add al, bl
先乘后除的解法:
mov al, 4
add al, 10 ;AL=14
mov ah, 7
mul ah ;AL*AH -> AX=98
mov bh, al ;Move to an extra register
mov ax, 15
mov bl, 5 ;Divider in BL
div bl ;AX/BL -> AL=3 (remainder in AH=0)
add al, bh
两种解决方案产生相同的结果 (101),并且仅使用 2 个寄存器(
AX
和 BX
)。