英特尔®8086组装流程的基本流程

时间:2018-11-20 16:57:26

标签: intel x86-16 emu8086

我正在尝试求解等式:例如,汇编语言中的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

1 个答案:

答案 0 :(得分:0)

private VehicleContext _vehicleContext;
        private IMailService _mailService;
        private IConfigurationRoot _config;

    public HomeController(IMailService mailService_, IConfigurationRoot 
    config_, VehicleContext vehicleContext_)
    {
        _vehicleContext = vehicleContext_;
        _mailService = mailService_;
        _config = config_;
    }
    public IActionResult Index()
    {
        var vehicleData = _vehicleContext.VehicleMakes.ToList();
        return View();
    }

除其他一些缺陷外,该计算甚至不遵循正常的代数规则。 当任务要求 7 *(4)时,您已经计算出7 * (4 + 10)+(15/5) + 10) +(15/5)

  • 上,除法和乘法都使用累加器,因此不可避免地,您将不得不从选择的任何一个中移出结果,然后在附加寄存器中进行。
  • 字节大小的除法在MOV BX,10 ADD BX,4 MOV AX,15 MOV BL,5 <<<< This overwrite the sum 10 + 4 in BX DIV BL ADD AX,BX <<<< Luckily remainder was zero MOV BX, 7 MUL BX <<<< Needlessly clobbers DX 中产生商,但在AL中产生余数。此任务要求您继续忽略所有余数的商。您的代码未明确将AH设为零,这对于通用解决方案还不够好!幸运的是15/5得出余数= 0。

乘法前除法的解决方案:

AH

除法前相乘的解决方案:

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

两个解决方案都产生相同的结果(101),并且仅使用2个寄存器(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 AX)。