8086简要汇编笔记

来源:互联网 发布:linux 查看挂载磁盘 编辑:程序博客网 时间:2024/06/16 14:59

通用寄存器: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汇编下可变长传参