使用 Intel 8086 汇编语言的 BEDMAS 进程[重复]

问题描述 投票:0回答:1

我正在尝试解决表达式: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
assembly intel x86-16 emu8086
1个回答
0
投票
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
)。

© www.soinside.com 2019 - 2024. All rights reserved.