博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
32位汇编学习笔记(1)
阅读量:4677 次
发布时间:2019-06-09

本文共 6740 字,大约阅读时间需要 22 分钟。

1.32位CPU所含有的寄存器有:(SUMMARY)

  a) 4个数据寄存器(EAX,EBX,ECX,EDX)

  b)2个变址和指针寄存器(ESI EDI)和2个指针寄存器(ESP EBP)

  c)6个段寄存器(ES CS DS SS FS GS)

     d)1个指令指针寄存器(EIP)和1个标志位寄存器(EFlags)

2。数据寄存器

  数据寄存器主要用来保存操作数和运算结果等信息·,从而节省读取操作数所需占用的总线和访问存储器的时间。

  32位CPU  有四个32位的通用寄存器  EAX EBX ECX 和EDX  

  对低16位的存取不会影响高16位的数据.这些低16位分别命名为AX BX CX DX 它和先前CPU中的寄存器相一致

  4个低16位寄存器可分割为8个独立的8位寄存器(AX --AL AH BX :BL BH   CX ;CL CH  DX :DL DH)

  

  寄存器EAX 通常称为累加器,用累加器进行的操作可能更少时间

  寄存器EBX称为基地址寄存器它可用存储器指针来使用、

  寄存器ECX称为计数寄存器

  在循环和字符串操作时,要用它来控制循环次数 ;  

 3.指针寄存器

  其低16对应先前CPU中的BP和SP,对低16位数据的存取·不影高16位的存取

  32位cpu有2个32位通用寄存器EBP ESP

  他们主要访问堆栈内存单元

  且EBP 基地址指针寄存器,用他可直接存取堆栈中的数据

  ESP 为堆栈指针寄存器,用他可以访问堆栈

  4段寄存器

  段寄存器是根据内存分段 的管理模式 而设置。内存单元的物理地址有段寄存器的 值和一个偏移量组合而成,这样可用

两个较少位数的值组合而成一个可访问较大物理空间的内存地址

 

   CPU内部的段寄存器

      ECS代码段寄存器

      EDS数据段寄存器

      EES附加段寄存器

      ESS堆栈段寄存器  

      EFS附加段寄存器

      EGS附加段寄存器

  32位CPU的两种不同的工作模式*(实模式和保护方式)

6、标志寄存器

一、运算结果标志位

1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。

2、奇偶标志PF(Parity Flag)

奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。

3、辅助进位标志AF(Auxiliary Carry Flag)

在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0

(1)、在字操作时,发生低字节向高字节进位或借位时;

(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CFZFSFOF的使用频率较高,而标志位PFAF的使用频率较低。

4、零标志ZF(Zero Flag)

零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

5、符号标志SF(Sign Flag)

符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1

6、溢出标志OF(Overflow Flag)

溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0

“溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。

二、状态控制标志位

状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。

1、追踪标志TF(Trap Flag)

当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。

指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。

2、中断允许标志IF(Interrupt-enable Flag)

中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
CPU的指令系统中也有专门的指令来改变标志位IF的值。

3、方向标志DF(Direction Flag)

方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。
在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。

三、32位标志寄存器增加的标志位

1、I/O特权标志IOPL(I/O Privilege Level)
I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。
如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。

2、嵌套任务标志NT(Nested Task)

嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:

(1)、当NT=0,用堆栈中保存的值恢复EFLAGSCSEIP,执行常规的中断返回操作;

(2)、当NT=1,通过任务转换实现中断返回。

3、重启动标志RF(Restart Flag)

重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示“接受”调试故障,否则拒绝之。
在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1

4、虚拟8086方式标志VM(Virtual 8086 Mode)

如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。

汇编指令集合

一、常用指令
1. 通用数据传送指令.
   MOV 传送字或字节.
   MOVSX 先符号扩展,再传送.
   MOVZX 先零扩展,再传送.
   PUSH 把字压入堆栈.
   POP 把字弹出堆栈.
   PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
   POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
   PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
   POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
   BSWAP 交换32位寄存器里字节的顺序
   XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
   CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
   XADD 先交换再累加.( 结果在第一个操作数里 )
   XLAT 字节查表转换.
   BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )

2. 输入输出端口传送指令.

   IN I/O端口输入. ( 语法: IN 累加器, {
端口号│DX} )
   OUT I/O端口输出. ( 语法: OUT {
端口号│DX},累加器 )
   输入输出端口由立即方式指定时其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.
3. 目的地址传送指令.
   LEA 装入有效地址.
     例: LEA DX,string ;把偏移地址存到DX.
   LDS 传送目标指针,把指针内容装入DS.
     例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
   LES 传送目标指针,把指针内容装入ES.
     例: LES DI,string ;把段地址:偏移地址存到ESDI.
   LFS 传送目标指针,把指针内容装入FS.
     例: LFS DI,string ;把段地址:偏移地址存到FSD.
   LGS 传送目标指针,把指针内容装入GS.
     例: LGS DI,string ;把段地址:偏移地址存到GSDI.
   LSS 传送目标指针,把指针内容装入SS.
     例: LSS DI,string ;把段地址:偏移地址存到SSDI.

4. 标志传送指令.

   LAHF 标志寄存器传送,把标志装入AH.
   SAHF 标志寄存器传送,AH内容装入标志寄存器.
   PUSHF 标志入栈.
   POPF 标志出栈.
   PUSHD 32位标志入栈.
   POPD 32位标志出栈.

二、算术运算指令

   ADD 加法.
   ADC 带进位加法.
   INC 加 1.
   AAA 加法的ASCII码调整.
   DAA 加法的十进制调整.
   SUB 减法.
   SBB 带借位减法.
   DEC 减 1.
   NEC 求反(以 减之).
   CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
   AAS 减法的ASCII码调整.
   DAS 减法的十进制调整.
   MUL 无符号乘法.
   IMUL 整数乘法.

     以上两条,结果回送AHAL(字节运算),DXAX(字运算),

   AAM 乘法的ASCII码调整.
   DIV 无符号除法.
   IDIV 整数除法.
     以上两条,结果回送:
     商回送AL,余数回送AH, (字节运算);
     或 商回送AX,余数回送DX, (字运算).

   AAD 除法的ASCII码调整.

   CBW 字节转换为字. (AL中字节的符号扩展到AH中去)
   CWD 字转换为双字. (AX中的字的符号扩展到DX中去)
   CWDE 字转换为双字. (AX中的字符号扩展到EAX中去)
   CDQ 双字扩展. (EAX中的字的符号扩展到EDX中去)

三、逻辑运算指令

   AND 与运算.
   OR 或运算.
   XOR 异或运算.
   NOT 取反.
   TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
   SHL 逻辑左移.
   SAL 算术左移.(=SHL)
   SHR 逻辑右移.
   SAR 算术右移.(=SHR)
   ROL 循环左移.
   ROR 循环右移.
   RCL 通过进位的循环左移.
   RCR 通过进位的循环右移.
     以上八种移位指令,其移位次数可达255.
     移位一次时可直接用操作码如 SHL AX,1.
     移位>1次时则由寄存器CL给出移位次数.
      如 MOV CL,04
         SHL AX,CL

四、串指令

   DS:SI 源串段寄存器 :源串变址.
   ES I 目标串段寄存器:目标串变址.
   CX 重复次数计数器.
   AL/AX 扫描值.
   D标志 0表示重复操作中SIDI应自动增量; 1表示应自动减量.

Z标志 用来控制扫描或比较操作的结束.

   MOVS 串传送.
   ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
   CMPS 串比较.
   ( CMPSB 比较字符. CMPSW 比较字. )
   SCAS 串扫描.
     把ALAX的内容与目标串作比较,比较结果反映在标志位.
   LODS 装入串.
     把源串中的元素(字或字节)逐一装入ALAX.
   ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
   STOS 保存串.
   是LODS的逆过程.
   REP 当CX/ECX<>0时重复.
   REPE/REPZ 当ZF=1或比较结果相等,CX/ECX<>0时重复.
   REPNE/REPNZ 当ZF=0或比较结果不相等,CX/ECX<>0时重复.
   REPC 当CF=1CX/ECX<>0时重复.
   REPNC 当CF=0CX/ECX<>0时重复.

五、程序转移指令

1.简单的条件转移指令
JZ(或jE)    OPR---------------结果为零转移测试条件ZF=1
JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0
JS   OPR----------------------结果为负转移测试条件SF=1
JNS   OPR---------------------结果为正转移测试条件SF=0
JO   OPR--------------------- 溢出转移,      测试条件OF=
JNO   OPR --------------------不溢出转移 ,   测试条件SF=0
JP   OPR ---------------------结果为偶转移测试条件SF=1
JNP   OPR --------------------结果为奇转移 测试条件SF=0
JC   OPR -------------------- 有进位转移 ,   测试条件SF=1
JNC   OPR --------------------无进位转移,    测试条件SF=0

2.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移)

JB(或JNAE) opd --------------小于或者不大于等于则转移
JNB(或JAE) opd---------------不小于或者大于等于则转移
JA(或NJBE) OPD---------------大于或者不小于等于则转移
JNA(或JBE) OPD---------------不大于或者小于等于则转移

3.带符号比较条件转移指令

JL(或JNGE) --------------小于或者不大于等于则转移
JNL(或JGE)--------------不小于或者大于等于则转移
JG(或NJLE)---------------大于或者不小于等于则转移
JNG(或JLE)---------------不大于或者小于等于则转移

六、调用子程序与返回指令

CALL     子程序调用指令
RET   子程序返回指令

六、其它指令

OFFSET   -------------------- 返回偏移地址
SEG     -------------------- 返回段地址
EQU(=) -------------------- 等值语句
PURGE -------------------- 解除语句
DUP    -------------------- 操作数字段用复制操作符
SEGMENT,ENDS -------------------- 段定义指令
ASSUME   -------------------- 段地址分配指令
ORG    -------------------- 起始偏移地址设置指令
$      --------------------地址计数器的当前值
PROC,ENDP -------------------- 过程定义语句
NAME,TITLEEND -------------------- 程序开始结束语句
MACRO,ENDM    --------------------宏定义指令
XLAT    (TRANSLATE) --------------------   换码指令----

七、条件标志
ZF 零标志 -- 当结果为负时,SF=1,否则,SF=0.
AF 辅助进位标志---运算过程中第三位有进位值,AF=1,否则,AF=0
PF 奇偶标志------当结果操作数中偶数个"1",PF=1,否则,PF=0
SF 符号标志----当结果为负时,SF=1;否则,SF=0.溢出时情形例外
CF 进位标志----- 最高有效位产生进位值,例如,执行加法指令时,MSB有进位,CF=1;否则,CF=0.
OF 溢出标志-----若操作数结果超出了机器能表示的范围,则产生溢出,OF=1,否则,OF=0

 

 

 

转载于:https://www.cnblogs.com/sz-xxc-1234/p/3665256.html

你可能感兴趣的文章
HEAP CORRUPTION DETECTED
查看>>
Android URI简单介绍
查看>>
蒙板 模态对话框
查看>>
pythong中的全局变量的调用和嵌套函数中变量的使用
查看>>
【POJ - 3009】Curling 2.0 (dfs+回溯)
查看>>
Windows下载安装良心教程
查看>>
浅析商业银行“业务连续性管理体系”的构建
查看>>
【分享】从《水浒传》中反思什么是真正的执行力
查看>>
java中的static
查看>>
5.侧边栏逻辑
查看>>
评论博客
查看>>
用户代理字符串识别工具源码与slf4j日志使用
查看>>
提示框第三方库之MBProgressHUD
查看>>
C语言 10-字符和字符串常用处理函数
查看>>
C++ 表达式语句 海伦的故事
查看>>
32位汇编学习笔记(1)
查看>>
day_01
查看>>
2013年12月日本語能力試験N3聴解部分
查看>>
uva 1349(拆点+最小费用流)
查看>>
关于SessionFactory的不同实现类分别通过getCurrentSession()方法 和 openSession() 方法获取的Session对象在保存对象时的一些区别...
查看>>