抱歉,评论被关闭
之前学习汇编基础总结
8086cpu外部总线20位=段地址*16+偏移地址 debug 里安全空间 0:200~0:3ff
od 反编译
0、debug 调试
1、fff00H-FFFFFH
-d fff0:0 ff 可以查出主板出厂时间
2、b8100H cpu 显存地址
3、数据的段地址ds获取;代码的段地址从cs获取, 栈的段地址从ss获得
4、mov ax,[0] 与[0]在debug表示内存单元 而在masn编译器里表示0 而masn 用[bx] 间接–>mov bx,1 mov ax,[bx] 在masn也可以用 mov ax,ds:[0]
在masn中
mov al,[0] (al)=0
mov al,ds:[0] (al)=(ds:[0])
mov al,[bx] (al)=(ds:[bx])
mov al,ds:[bx] (al)=(ds:[bx])
5、si和di 不能是8位 功能相似于通用寄存器bx
6、db 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 <—- 8个0 字节型数据
dw 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 <—- 16个0 字型
dd 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 <—- 32个0 双字
7、暂时存放数据—-通用寄存器、开辟内存、栈(push pop 推荐使用这个)
8、64速度:cpu 64bit,操作系统64bit 软件64bit
9 div 除非指令 除数 8位时被除数16位(ax) 除数16位被除数32位(dx+ax)
结果 : 8位 商放到al 余数 ah
16位 商放到Ax 余数 dx
指令格式 div reg
div 内存单元
10 65535 ffff(16位) 255 ff(8位)
11 dup 和db dw dd 伪指令 db 3 dup(0) 定义3个字节 他们的值都是0
db 3 dup (0,1,2) 定义9个字节 他们的0,1,2,0,1,2,0,1,2
12 offset 偏移
start:mov ax,0
mov bx,offset start
13 jmp 跳转 cpu不需要 提供目标地址, 提供是偏移地址
jmp short ptr -128~127 8位 负数有补码 表示, 它往上跳, 正数往下跳
jmp near ptr -32769~32767 16位
jmp far ptr 远 转移 必须给出目标地址
jmp word ptr
jmp dword ptr
14 栈 ss栈段地址 sp栈偏移地址
push 入栈 先sp =sp-2 再推入数据
pop 出栈 先拿出数据 再sp=sp+2
15 数据处理的两个基本问题
A:存放位置 直接寻址、寄存器寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址
B:数据有多长 寄存器(ax,al)、用操作符号x ptr(word ptr)、其他(push [1000]栈固定字型数据)
16 call和ret 函数模块化设计
call far ptr 标号 等于 push CS push IP jmp far ptr 标号
ret pop IP jmp ip
17 乘法 mul
mul byte ptr ds:[0] 含义 (ax)=(al)*((ds)*16+0);
mul word ptr [bx+si+8] 含义 (ax)=(ax)*((ds)*16+(bx)+(si)+8)
(bx)=(ax)*((ds)*16+(bx)+(si)+8)
18 标志寄存器
11 10 9 8 7 6 4 2 0
标志寄存器: OF DF “IF” SF ZF AF “PF” CF
默认值0: NV UP EI PL NZ NA PO NC
值1: OV DN byte ptr NG ZR PE CY
ZF 结果为0 ZF=1 结果不为0 ZF=0
PF 结果为偶 PF=1 结果为奇 PF=0 二进制
SF 结果为负 SF=1 结果为正 SF=0 第7位
DF 结果为0 每次操作后si,di递增 结果为1 每次操作后si,di递减
IF 结果为0 禁止其他可屏蔽中断 反之
sti 用设置IF=1 cli IF=0
cld指令:将DF设置0 std指令:将DF设置1
movsb ds:si指向内存单元中的字节送入es:di ((es)*16+(di))=((ds)*16+(si)) DF决定si,di
rep movsb rep的作用是根据cx的值 ,重复执行后面的串传递指令
cf=carry 进位或借 of=overflow 溢出 对于无符号数是进位-只看cf 对于有符号位是溢出–只看(of)和符号位SF
19 je 等于才转移 (检测zf=1) jne 不等于转移 ZF=0
jb 低于转移 CF=1 jnb不低于转移 CF=0
ja 高于转移 CF=0,ZF=0 jna不高于转移 CF=1 或ZF=1
20 adc 加法 和sbb 减法 (cmp不保存结果 改变标志寄存器的值)
adc ax,bx==> (ax)=(ax)+(bx)+CF
21 pushf:将标志寄存器的值压栈 popf:从栈中弹出数据,送入标志寄存器 iret 中断恢复
22 如何设置中断向量表 (存放中断向量表 0:0~0:3ff)
中断类型码找到中断向量 并用它设置CS和IP使CPU执行中断处理程序
中断向量表存放程序入口(中断类型码*4)=ip (中断类型码*4+2)=cs
8086CPU中断过程
A.取得中断类型码 B.pushf C.TF=0,IF=0
D.push CS E.push IP F. (IP)=(N*4),(CS)=(N*4+2)
23 端口 in和out 只能使用ax al (cmos RAM 包括一个时钟 128字节RAM )
in al,20h 从20端口读取一个字节数据到al
out 20h,al
24 shl shr 逻辑位移指令
本文出自 “凹凸曼” 博客,请务必保留此出处 http://www.apoyl.com/?p=2088