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]
写一个测试程序:
;计算378除以37的结果
mov ax, 378
mov bl, 37
div bl ; AL=商(10), AH=余数(8)
写入主引导扇区的话还需要加上0x55, 0xaa
xor
start:
;计算65535除以10的结果
mov ax, 65535
mov dx, 0
mov bx, 10
div bx
;AX=商(6553),DX-余数(5)
current:
times 510-(current-start) db 0
db 0x55, 0xaa
xor r/m, r/m/imm
r 寄存器 m 内存地址 imm立即数
add r/m, r/m/imm
相加的和保存在左操作数中,两个操作数不可同时为内存地址
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
加载器的工作流程:
- 读取用户程序的起始扇区;
- 把整个用户程序都读入内存;
- 计算段的物理地址和逻辑段地址(段的重定位);
- 转移到用户程序执行(将处理器的控制权交给用户程序);