8086简要汇编笔记
通用寄存器:ax bx cx(循环) dx
栈寄存器 :ss sp
执行代码:cs ip
堆段寄存器:ds
使用bp []默认ss
辅助:di si
codesg segment:
可能存在数据
start: 代码开始片段,使ip为代码开始位置
mov ax,4c00H 结束返回0
int 21h 21号中断
codesg ends
end start
mov cx,num
s:
loop s 循环num次 (转移)
assume 编译器指令 cs:sg 将寄存器值变为sg
sg segment
sg ends
push pop 字操作
word ptr/byte ptr
dw dd
db
num dup (data) 定义重复数据
add sub
div dx ax / word ptr ds:[] (16位)-> ax ... dx
ax / byte ptr [] (8位) ->al ...ah
低位存值 高位存余
Inc 自增 dec 自减
mul al(8位) * byte ptr ds:[] ->ax
ax * word ptr [] ->dx高 ax低
jmp 无条件转移 偏移量
段内转移
-128-127 短转移 short
-32768-32767 近转移 near ptr
word ptr 地址在内存中的 段内转移
dword ptr 段间转移 cs:ip
far ptr 段间转移
jcxz 有条件短转移
if(cx==0) jmp short
offset 获取偏移地址
ret 用栈中数据,修改IP 实现近转移
retf 用栈中数据 修改CS IP 实现远转移
Iret 用于int的指令的返回
call=
push IP
jmp near ptr
call word ptr
call far ptr
call dword ptr
flag (如mov,push,pop转移指令不影响)
ZF 记录结果是否为0 结果是0为 1 否则为0
PF 偶数1 奇数0
SF 记录结果是否为负 负为1 非负为0
CF 记录最高有效位向更高有效位的进位值或借位值(仅用于无符号计算)
OF 溢出标志,发生溢出为1 ,否则为0(仅用于有符号计算)
DF 方向标志位 cld df=0 std df=1
adc = 对象1 +对象2 +CF
sbb = 对象1 - 对象2 -CF
cmp
ZF A=B,ZF=1 A!=B,ZF=0
CF A<B A-B CF=1 ,A>B A-B CF=0 ZF=0,A>=B CF=0 OR ZF=1,A<=B CF=1 OR ZF=1
je
jne
jb
jnb
ja
Jna
Movsb df =0 si+1 di +1 df =1 si-1 di-1
Movsw
Rep movsb
Pushf popf 将标志寄存器的值压栈或出栈
内中断
除法错误 0
单步执行 1
Into 4
Int n
Iret pop ip pop cs popf
TF =1 单步执行
IF=1 响应中断 sti cli
不中断特殊情况:例如mov ss 由于给sp设置让步,不响应中断
In out 端口读写
Shl 左移 将最后移出 的一位写入CF中 最低位用0补充shr 右移
直接定址表
a db 1,2,3 同时描述内存地址和单元长度 例如code:0以后的都是单字节单元
a[]
Assume Ds:data (仅仅关联,并不表示ds中一定是data段)
Data segment
A db 1,2,3,4
Data ends
Code segment
Mov si,0
Mov ax,data
Mov ds,ax
A[si]
Code ends
Int 9h 键盘中断写入环形队列缓冲区 in al,60h端口
Int 16h 从缓冲区读取 ah=扫描码 al=ascii
Int 13h 磁盘中断
Ah = 02h 读 03h写
Es:bx 内存映射空间
Al 读取 写入的扇区数
Ch 磁头号
Cl 扇区号
Dl 驱动器号
Dh 磁头号
逻辑扇区号= (面号*80+磁道号)*18+扇区号-1
c0s.obj
8086汇编下可变长传参