之前学习汇编基础总结

分类:汇编 | 作者:凹凸曼 | 发表于2017/01/17 之前学习汇编基础总结已关闭评论

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

Tag:

日志信息 »

该日志于2017-01-17 11:10由 凹凸曼 发表在汇编分类下, 评论已关闭。

目前盖楼

抱歉,评论被关闭

« »