汇编学习笔记(一)-- 基本知识
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指令
[align=right](续表)[/align]
使用无符号数比较的JCC指令
使用有符号数比较的JCC指令
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 |
指 令 | 描 述 | 条 件 | 别 名 | 相反指令 |
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 |
指 令 | 描 述 | 条 件 | 别 名 | 相反指令 |
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 |
指 令 | 描 述 | 条 件 | 别 名 | 相反指令 |
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 |
相关文章推荐
- Pascal转C++学习笔记 ——1.基本知识
- RPG学习笔记(基本知识了解)
- 【Java学习笔记】基础知识学习3【基本循环方法技巧】
- 汇编语言王爽第二版学习笔记第一章:基础知识
- 汇编语言 学习笔记(基础知识三-----内存地址空间)
- ARM汇编程序基本知识[笔记]
- 【Java学习笔记】基础知识学习4【数组的基本知识】
- 汇编学习笔记--数据处理的两个基本问题
- ARM 学习笔记(一)基本知识
- 汇编语言学习笔记-创建最基本的windows窗体
- Hadoop学习笔记(五):一些关于HDFS的基本知识
- PHP学习笔记(2)--PHP数据库操作基本知识
- 汇编语言 学习笔记(基础知识)
- 存储过程学习笔记三---T-SQL基本知识
- cocos2d学习笔记(一) cocos2d的基本知识和环境配置
- Lua学习笔记(1)--基本知识介绍
- JavaScript学习笔记(九) 函数的基本知识和专业术语
- Hadoop学习笔记(五):一些关于HDFS的基本知识
- BizTalk Server – 基本知识学习笔记(1)
- 【Java学习笔记】基础知识学习1【基本输出,数据类型,基础运算符号】