div

除数所在的寄存器或者内存地址

  • 如果在指令中指定的是8位寄存器或者8位操作数的内存地址,则意味着被除数在寄存器AX里。
  • 相除后,商在寄存器AL里,余数在寄存器AH里。

div bh
div byte [0x2002]

  • 如果在指令中指定的是16位寄存器或者16位操作数的内存地址,则意味着被除数是32位的,低16位在寄存器AX里;高16位在寄存器DX里。
  • 相除后,商在寄存器AX里,余数在寄存器DX里。

div bx
div word[0x2002]

image.png

image.png
写一个测试程序:

  1. ;计算378除以37的结果
  2. mov ax, 378
  3. mov bl, 37
  4. div bl ; AL=商(10), AH=余数(8

写入主引导扇区的话还需要加上0x55, 0xaa

xor

  1. start:
  2. ;计算65535除以10的结果
  3. mov ax, 65535
  4. mov dx, 0
  5. mov bx, 10
  6. div bx
  7. ;AX=商(6553),DX-余数(5
  8. current:
  9. times 510-(current-start) db 0
  10. db 0x55, 0xaa

xor r/m, r/m/imm
r 寄存器 m 内存地址 imm立即数

add r/m, r/m/imm
相加的和保存在左操作数中,两个操作数不可同时为内存地址

image.png

DS:SI 原始数据串的段地址:偏移地址
ES:DI 目标位置的段地址:偏移地址

  • 寄存器BX在设计之初的作用之一就是用来提供数据访问的及地址,所以又叫基址寄存器
  • 在设计8086处理器时,每个寄存器都有自己的特殊用途,比如AX是累加器(Accumulator),与它有关的指令还会做指令长度上的优化(较短); CX是计数器; DX是数据寄存器,除了作为通用寄存器使用外,还专门用于和外设之间进行数据传送;SI是源索引寄存器;DI是目标索引寄存器,用于数据传送操作,我们已经在movsb和movsw指令的用法中领略过。

cbw 将AL中的有符号数扩展到AX cwde 将AX中的有符号数扩展到EAX cdqe 将EAX中的有符号数扩展到RAX cwd 将AX中的有符号数扩展到DX:AX cdq 将EAX中的有符号数扩展到EDX:EAX cdo 将RAX中的有符号数扩展到RDX:RAX

image.png

image.png

image.png
条件转移指令和cmp指令
image.png
栈寄存器
image.png
image.png

加载器的工作流程:

  • 读取用户程序的起始扇区;
  • 把整个用户程序都读入内存;
  • 计算段的物理地址和逻辑段地址(段的重定位);
  • 转移到用户程序执行(将处理器的控制权交给用户程序);