x86汇编程序设计期末知识点总结

Posted mrqy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了x86汇编程序设计期末知识点总结相关的知识,希望对你有一定的参考价值。

x86知识点总结

第一章

1.常用Ascii码

‘A’—’Z’ 41h — 5Ah ‘1’—’9’ 31h — 39h
‘a’—’z’ 61h — 7Ah 空格—20h ‘\\0’ — 00h
换行—0Ah 回车 — 0Dh 换页 — 0Ch 文件尾 — 1Ah
DOS(Windows)文本换行——0Dh,0Ah;
Unix文本换行——0Ah

第二章

1.PC机和CPU组成

PC三大部分: 中央处理器(CPU)、存储器、输入/输出(I/O)子系统;

一般计算机的五大部分: 运算器、存储器、控制器、输入设备、输出设备;

CPU: 由运算器和控制器组成;

8086 CPU的三部分:ALU, 控制逻辑,寄存器组;

​ 字长(ALU, 寄存器) : 16位;
​ 地址:20根地址线(寻址能力为1 MB);
​ 外部数据总线:16位(8086), 8位(8088) ;最早的PC以8088为主

2. 8086寄存器

2.1 通用寄存器

数据寄存器

数据寄存器

指针/变址寄存器

数据寄存器

2.2 段寄存器

CS——代码段寄存器

DS——数据段寄存器

SS——堆栈段寄存器

ES——附加段寄存器

2.3 指令指针

IP ——指令指针(指令计数器)

2.4 标志寄存器

PSW——程序状态字寄存器

SS:SP组成当前堆栈 CS:IP组成当前可执行点

2.4.1标志寄存器详解

9个1位的标志寄存器,组合在一起,放入一个16位的程序状态字寄存器PSW中

OF 溢出标志 DF 方向标志 SF 符号标志 IF 中断标志
ZF 零标志 TF 陷阱标志 CF 进位标志 PF 奇偶标志
AF 辅助进位标志

PSW组成

2.4.2 标志寄存器在debug中的表现

标志寄存器在debug中的表现

3. PC机内存组织

3.1 字节,字,双字的存放
3.2 物理地址和逻辑地址

4. 堆栈

  • 栈底由SP初始值确定,为堆栈段最大单元处的地址加1;
  • 栈顶由当前的SP值确定,随着PUSH,POP动态变化;
  • 先进后出原则;
  • 压栈:可由PUSH,PUSHF显式实现,也可由CALL,INT实现;
  • 弹栈:可由POP,POPF显式实现,也可由RET,IRET实现;
  • 压栈和弹栈只能以字为单位;

第三章

1.与数据有关的6种寻址方式

立即寻址:指令操作数包含在指令中,为一个常量或常数,称为立即数
-立即寻址只能出现在源操作数位置,不能出现在目的操作数的位置;
-立即数为常数,可以直接写在指令中;
-立即数位常量,需要在指令前用EQU定义。

寄存器寻址:指令操作数为CPU的寄存器
-MOV当使用CS,DS,SS,ES段寄存器时,必须按照MOV数据通路要求
-操作数中的寄存器可能是隐含的寄存器,如PUSHF,STD等。

直接寻址:操作数的偏移地址EA直接在指令中给出
MOV AX,[2000H]
-若没有段超越,一般取操作数相对于数据段DS,所以可以省略不指定;
-指令中出现的变量,会被代替为偏移值,所以也是直接寻址
x DW \'A\'
MOV AX, c
MOV AX,x+1
-对于取地址的操作,变量名实际上是一个立即数,是立即寻址:
LEA BX,x3
MOV BX, OFFSET x3
-LEA BX,[SI]相当于MOVE,是寄存器寻址

寄存器间接寻址:操作数地址EA位于一个寄存器(BX,BP,SI,DI)中
-默认:BX,SI,DI相对于DS段偏移地址,BP相对于SS段偏移地址;
-只能用基址寄存器BX,BP和变址寄存器SI,DI,不能用其他寄存器;

寄存器相对寻址:操作数地址EA由地址寄存器+8位和16位的常量组成
-段寄存器默认规则同上;
MOV AX,[SI+10H]
MOV AX,10H[SI]
-偏移量可以是符号名或变量名;
MOV AX,ARRAY[SI]
MOV TABLE[DI],AL
MOV TABLE[DI+1],AL

基址变址寻址:操作数地址EA为一个基址寄存器和一个变址寄存器之和
-若基址寄存器为BX,则缺省时段寄存器为DS;若基址寄存器为BP,则缺省时段寄存器为SS;
MOV AX, [BX][SI]
MOV ES:[BX+SI],AL
-可以将其理解为寄存器相对寻址加上一个变址寄存器;
MOV AX,[BX+SI+200]
MOV ARRAY[BP+SI],AX
-基址寄存器只能是BX,BP,变址寄存器只能是SI,DI

2.与转移有关的4种寻址方式

段内直接寻址:

​ -JMP NEAR PTR 标号 //16位偏移值;
-JMP SHORT 标号 //8位偏移值,段内直接短转移;
-汇编后指令中不会直接出现偏移地址,而是相对于当前IP的位移量;
-条件跳转只能是8位偏移量,省略SHORT;JMP两者皆可,缺省默认位16位;

段内间接寻址:JMP WORD PTR 寄存器或内存单元;
-CALL BX //跳转地址是寄存器
-CALL [BX] //跳转地址是内存单元
-寄存器可以是AX,BX,CX,DX,SI,DI,BP,SP中任何一个

段间直接寻址:JMP FAR PTR 标号;
-要转移的标号或过程名必须具备far属性;

段间间接寻址:JMP DWROD PTR 内存单元;
-要转移的地址只能位于内存单元,不能位于寄存器中;
-取内存中的一个双字,高位送入CS,低位送入IP;

3. 8086指令系统

3.1 传送指令
3.1.1数据通路规则

![数据通路规则](C:\\Users\\QY PC\\Desktop\\x86汇编\\期末复习\\图片\\数据通路规则.png)

3.1.2段超越

默认段寄存器:数据访问一般相对DS,BP相对于SS,转移相对于CS,串指令的DI相对于ES

段超越:指定段寄存器,改变默认规则

3.1.3 MOV,XCHG

MOV dst,src
-源和目的必须长度匹配;
-必须符合数据通路规则;
-可以通过BYTE PTR,WROD PTR,DWORD PTR明确指定内存操作数的类型,或强制类型转换;
-MOV和XCHG执行后都不影响标志寄存器;

3.1.4 PUSH,POP,PUSHF,POPF

​ -SRC和DST可以是寄存器及内存操作数(可以是除立即数以为的如何寻址方式)
-堆栈操作只能以字为单位,不能是字节;
-PUSH指令可以用CS,POP则不可以;

3.1.5 地址传送指令LEA,LDS,LES

​ LEA reg,src //将src的偏移地址送入reg,等价于OFFSET
LDS reg,src //取src中的双字,高位送入DS,低位送入reg
LES reg,src //取src中的双字,高位送入ES,低位送入reg

​ 三条指令中,reg不能是段寄存器。
LDS,LES中若src为指定类型的变量(直接寻址),该变量必须为DD;
若src为寄存器间接/相对寻址,自动默认为DWORD PTR,但是要符合基址/变址寄存器的要求。

3.2 算数运算指令
3.2.1 加减法指令

ADD dst,src ;dst=dst+src,影响CF,SF,ZF等
ADC dst,src ;dst=dst+src+CF,影响CF,SF,ZF
INC opr ;opr=opr+1,影响CF,SF,ZF

SUB dst,src ;dst=dst-src,影响CF,SF,ZF等
SBB dst,src ;dst=dst-src-CF,影响CF,SF,ZF
DEC opr ;opr=opr+1,影响CF,SF,ZF

3.2.2 乘除法指令

无符号乘法MUL src
-src为字节操作数——8位x8位,AX⟵AL x src
-src为字操作数———16位x16位,DX:AX⟵AX x src
-操作数可以是寄存器,内存但不能是立即数

无符号除法DIV src
-必须是32位除以16位,16位除以8位;
-除数和被除数都为16位,需将DX清零;
-16位除以8位,需主动考虑除法结果溢出的问题
-src为字节操作数——AX/src⟶AL(商),余数在AH中
-src为字操作数———DX:AX/src⟶AX(商),余数在DX中
-操作数可以是寄存器,内存但不能是立即数

3.2.3 带符号扩展指令

CBW:将AL的符号位扩展至AH。

3.2.4 逻辑运算指令

-AND dst,src
-OR dst,src
-XOR dst,src
-NOT dst

-TEST指令类似于AND,但不会将运算结果送至目的操作数,而是为了产生标志位,主要是ZF;由于测试一个对象的某一位/某几位的状态;

3.2.5 位移指令

count只能为1或者CL

位移指令

图解:

位移指令图解

3.3 控制转移指令
3.3.1 条件转移指令
3.3.2 无条件转移指令

位移指令

3.3.3 循环指令
3.3.4 调用返回指令

CALL指令执行过程:

CALL执行过程

RET指令执行过程:

RET执行过程

3.3.5 处理器控制命令

第四章

1.分段式程序结构

1.1 三段格式

(1)标号(符号、变量,不区分大小写),变成逻辑地址(立即数);
(2)指令或伪指令(助记符);
(3) 操作数;

1.2 定义段,子程序,宏
段定义
子程序定义
宏定义
1.3 数据定义

DB,DW,DD定义变量;
EQU定义常量(不占内存,被编译变成值)

字符串定义

STRING1 DB \'ABCD\',0DH,0AH,\'$\'
按字节分配单元

STRING2 \'AB\',\'CD\'
按字分配单元,高位在前低位在后

注:

1.对于DW,DD伪指令,不允许使用两个以上字符的字符串作为其参数。
2.定义数据时,可以用DW,DD把标号或变量的偏移地址或整个逻辑地址存入另一个变量中;

变量存逻辑地址

1.4 表达式与操作符
OFFSET与SEG

-OFFSET 变量名/标号
-SEG 变量名/标号

OFFSET:送回变量名或标号(过程名)的偏移地址;

SEG:送回变量名或标号(过程名)的段地址;

PTR

-类型 PTR 地址表达式

强制说明或转换存储单元的类型为BYTE,WORD,DWORD,FAR,NEAR中的一种。

THIS

-THIS 类型

为某个变量名指定一个类型(BYTE,WORD,DWORD),或为某个标号或过程名指定一种转移距离(NEAR,FAR),改操作数与下一个存储单元地址相同。

X1 EQU THIS BYTE
X2 DW 100 DUP(?)

段操作符

CS:,DS:,ES:,SS:,用于段超越

SHORT

用来指定JMP指令中转向地址为8位位移量,而不是缺省的16位位移量。

HIGH与LOW

操作对象位数值表达式或地址表达式,HIGH取高位字节,LOW取低位字节。

2.汇编与调试

2.1 debug主要命令

r——显示或修改寄存器

d——显示或修改内存单元(数据段、堆栈段)

u——反汇编,查看内存中的程序

e——改内存单元

a——汇编命令,直接在内存中输入指令序列

t——单步跟踪命令,进入子程序、循环、功能调用

p——单步执行命令,执行完子程序、循环、功能调用

g——运行命令,执行到某个指令(地址处)

q——退出debug

第五章

两种返回DOS的方式:

方式1:

MAIN	PROC	FAR
		;MOV		AX,STARK
		;MOV		SS,AX
		;MOV		DP,STARK_BOTTOM
		MOV		AX,DATA
		MOV		DS,AX
		...
		...
		...
EXIT:	MOV		AX,4C00H
		INT		21H
MAIN	ENDP
CODE	ENDS
		END		MAIN
		

方式2:

MAIN	PROC	FAR
		PUSH	DS
		XOR		AX,AX
		PUSH	AX
		...
		...
		...
		RET
MAIN	ENDP

1.数制转换与乘除法

2.字符串处理

2.1 串操作指令
取串指令LODSB/LODSW
存串指令STOSB/STOSW
串传送指令MOVSB/MOVSW

特例,两个操作数都是内存操作数

串比较指令CMPSB/CMPSW
串扫描指令SCASB/SCASW
重复前缀指令REP
条件重复前缀指令REPE/REPZ及REPNE/REPNZ
修改DF方向标志命令CLD和STD

以上是关于x86汇编程序设计期末知识点总结的主要内容,如果未能解决你的问题,请参考以下文章

Android逆向基础之ARM汇编语言知识总结

二进制分析实战:x86汇编快速入门

《80X86汇编语言程序设计教程》十五 任务切换实例

《80X86汇编语言程序设计教程》二十三 分页管理机制实例

《80X86汇编语言程序设计教程》二十四 进入与离开V86模式实例

内核基础---AT&T汇编与x86汇编的区别