您的位置:首页 > 其它

汇编学习笔记(一)-- 基本知识

2016-08-01 11:01 162 查看
一、基础知识

1、地址总线:有N根地址线,即宽度N,可寻址2的N次方内存单元。

2、数据总线:8088CPU有8根,8086CPU有16根,8根即8位,一个字节,16根即16位,2个字节,即一个字的宽度。

3、控制总线:决定了CPU对外部器件的控制能力

4、RAM:随机存储器,断电不保存(主存储器+内存扩展条+显卡的显存)

5、ROM:只读存储器,关机内容不丢失(装有BIOS的主板及各类接口卡,显卡,网卡等都有)

6、内存地址空间:所有的RAM与ROM对CPU来说都是内存,都与CPU直接相连,受限于CPU的寻址能力

二、寄存器

1、通用寄存器:AX,BX,CX,DX,8086CPU下都是16位。他们均可拆分为H与L高低两种寄存器

2、物理地址:8086CPU采用20根物理地址总线,但相关部件只提供16位地址,需要通过“段”+“偏移”经过地址加法器合成20位物理地址。

3、段与偏移:段地址:1000H,偏移地址:8621H,总的地址将是:18621H,算法:1000H*16+8621H=18621H

4、段寄存器:CS是代码段寄存器,IP是指令指针寄存器,任意时刻,CPU把CS:IP指向的内容当指令执行。

5、修改段:不能直接修改CS:IP,只能通过JMP指令修改,如:JMP 2AE3:3。若JMP 1000H,则不改变CS,只改IP

6、取内容:需要DS寄存器,不能直接给DS赋值,只能间接的由通用寄存器赋值,mov al,[0],会把DS:0中的内容给al,[ ]会从DS:x地址处取内容

7、栈地址:SS:SP,任意时刻,指向了栈顶元素的地址,SS是栈的段寄存器,SP是栈的偏移寄存器,push会导致SP减少,pop会增加SP,栈顶越界的问题,只能自己控制,CPU是不会操心这些问题的。

8、栈段容量:一个栈的段地址范围为0~FFFFH,即0~2的16次方,所以最大的范围是64KB。

9、【】:只有bx,bp,si,di才可以放在【】中,其他所有的寄存器都不可以。bx不能和bp组合,si不能和di组合。若存在bp,且没指定段,则默认为ss。

10、X ptr:word ptr指明了访问的单元长度是字,byte ptr指明了访问的单元长度是字节。使用立即数时,特别要注意标明长度。

11、dup:db 16 dup(0)表示定义了16个字节的数据,每个数据都是0,dup是重复的意思。

三、转移指令等

1、offset:取得标号的偏移地址。s:mov ax,offset s;表示取得s标号的偏移地址。

2、jmp short 标号:向前128,向后127,短范围内进行跳转到标号。汇编代码为EB xx,xx为要跳转的地址的偏移距离。举例:EB 03,向后跳转3个距离。

3、jmp near ptr 标号:段内近距离跳转,范围是-32768~32767,相当于把当前的IP加上(标号地址-jmp后的第一个字节)。

4、jmp far ptr 标号:段间远距离跳转,标号所在的段地址与偏移地址会覆盖当前的CS:IP。

5、jmp ax:和jmp near ptr 标号一样,属于段内近距离跳转。

6、jmp word ptr 内存单元地址:段内转移,即先定位内存单元地址的值,这个值长度为一个字,然后跳到这个值对应的地址。

7、jmp dword ptr 内存单元地址:段间转移,即把第一个字作为偏移地址,第二个字作为段地址。

8、jcxz 标号:即cx与z比较,z就是0,所以可以看作是(cx) == 0 ? 跳转:不跳转。这是短距离跳转,即jmp short 标号。

9、loop 标号:与jcxz相反,先把cx自减1,再判断。(cx) == 0 ? 不跳转:跳转。也是短距离跳转,即jmp short 标号。

10、跳转越界:编译会报错。

11、ret:首先从栈中拿出一个地址word ptr,然后修改IP,然后和jmp near ptr 标号 类似的近距离跳转。等同于:pop IP

12、retf:先从栈中拿出一个地址word ptr,用来修改IP,再拿出一个word ptr,用来修改CS,然后和jmp far ptr 标号 类似的远距离跳转。等同于:pop IP;pop CS。

13、call:先把IP压栈,再跳转jmp near ptr 标号;

14、call far ptr 标号:这时,要把CS,IP相继压栈,再jmp far ptr 标号;

15、call xxxxx:xxxxx如果长度是字,就把IP压栈。如果长度是双字,就要把CS和IP都压栈。

四、标志寄存器

1、ZF:执行一条指令后,如果结果为0,则ZF为1。ZF的简单意思是判断当前结果 == 0 ? 1: 0;影响的指令有:add、sub、mul、div、inc、or、and。

2、PF:奇偶校验位。如果是偶数,则PF为1。

3、SF:符号位。如果是负数,则SF为1.

4、CF:进位值。记录了最高位进位的标记,如果最高位进位了,CF就为1.

5、OF:溢出标志位。如果相加后参生了溢出,则OF为1.

6、adc:进位加法指令,比add多了一步是,+CF。

7、sbb:借位减法指令,比sub多了一步是,-CF。

8、cmp:无返回值的减法指令,也叫比较运算符。两数相减,结果为0时,ZF置为1,PF置为1.为负时,会改变CF的值。

五、条件跳转的各种类型

测试标志位的JCC指令

指令描 述
条 件
别 名
相 反 指 令
JC
如果进位位被置位则跳转
进位标志=1
JB,JNAE
JNC
JNC
如果进位位没有置位则跳转
进位标志=0
JNB,JAE
JC
JZ
如果0标志被置位则跳转
0标志=1
JE
JNZ
JNZ
如果0标志没有置位则跳转
0标志=0
JNE
JZ
[align=right](续表)[/align]

指 令
描 述
条 件
别 名
相反指令
JS
如果符号位被置位则跳转
符号标志=1
JNS
JNS
如果符号位没有被置位则跳转
符号标志=0
JS
JO
如果溢出标志置位则跳转
溢出标志=1
JNO
JNO
如果溢出标志没有置位则跳转
溢出标志=0
JO
JP
如果奇偶校验位被置位则跳转
奇偶校验标志=1
JPE
JNP
JPE
如果奇偶校验位为偶校验则跳转
奇偶校验标志=1
JP
JPO
JNP
如果奇偶校验位没有被置位则跳转
奇偶校验标志=0
JPO
JP
JPO
如果奇偶校验位为奇校验则跳转
奇偶校验标志=0
JNP
JPE
使用无符号数比较的JCC指令

指 令
描 述
条 件
别 名
相反指令
JA
如果超过(>)则跳转
进位标志=0,0标志=0
JNBE
JNA
JNBE
如果不低于或等于(不 <=)则跳转
进位标志=0,0标志=0
JA
JBE
JAE
如果超过或等于(>=)则跳转
进位标志=0
JNC,JNB
JNAE
JNB
如果不低于则跳转(不 <)
进位标志=0
JNC,JAE
JB
JB
如果低于(<)则跳转
进位标志=1
JC,JNAE
JNB
JNAE
如果不超过或等于(不>=)则跳转
进位标志=1
JC,JB
JAE
JBE
如果低于或等于(<=)则跳转
进位标志=1或0标志=1
JNA
JNBE
JNA
如果不超过(不>)则跳转
进位标志=1或0标志=1
JBE
JA
JE
如果相等(=)则跳转
0标志=1
JZ
JNE
JNE
如果不相等(<>)则跳转
0标志=0
JNZ
JE
使用有符号数比较的JCC指令
指 令
描 述
条 件
别 名
相反指令
JG
如果大于(>)则跳转
符号标志=溢出标志或0标志=0
JNLE
JNG
JNLE
如果小于或等于(<=)则跳转
符号标志=溢出标志或0标志=0
JG
JLE
JGE
如果大于或等于(>=)则跳转
符号标志=溢出标志
JNL
JGE
JNL
如果不小于(不<)则跳转
符号标志=溢出标志
JGE
JL
JL
如果小于(<)则跳转
符号标志<>溢出标志
JNGE
JNL
JNGE
如果大于或等于(>=)跳转
符号标志<>溢出标志
JL
JGE
JLE
如果小于或等于(<=)跳转
符号标志<>溢出标志或0标志=1
JNG
JNLE
JNG
如果不大于(不>)则跳转
符号标志<>溢出标志或0标志=1
JLE
JG
JE
如果等于(=)则跳转
0标志=1
JZ
JNE
JNE
如果不等于(<>)则跳转
0标志=0
JNZ
JE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: