第一章 基本概念
汇编语言是一种助记符的语言,面向开发者。
机器语言是一种纯数字的语言,面向处理器。
汇编语言不是可移植的,具有较强的平台依赖性。
1.1 源码、反码、补码、移码之间的转换
当源码为正数时,源码=反码=补码,移码=补码+127
当源码为负数时,符号位不变其他位取反就为反码,反码+1为补码,移码为将补码符号位取反
补码转化为真值,符号位为0就为其他几位转化为十进制即可
符号位为1就用-128+其他几位转化为十进制就为真值
补码真值=符号位* (-2^N-1)+其余N-1位值
C/C++内嵌汇编中可否定义数据(不行)
设置奇偶标志位依据(低8位)
第二章 x86处理器架构
2.1 操作模式
**保护模式:**处理器的基本模式,所有指令和特性都可用,程序具备独立的内存段,地址线32位,4GB地址空间。
**虚拟8086模式:**处理器可以安全地在多任务系统中执行实地址模式的软件,而不会影响其它运行的程序,地址线20位,1MB地址空间。
**实地址模式:**具有基本x86处理器环境和一些新增的特性,能够直接访问内存和硬件资源,地址线20位,1MB地址空间。
**系统管理模式:**实现电源管理和系统安全等。
2.2 通用寄存器
32位 | 16位 | 8位(高) | 8位(低) |
---|---|---|---|
EAX | AX | AH | AL |
EBX | BX | BH | BL |
ECX | CX | CH | CL |
EDX | DX | DH | DL |
32位 | 16位 |
---|---|
ESI | SI |
EDI | DI |
EBP | BP |
ESP | SP |
2.3 状态标志位
进位标志位(CF),与目标位置相比,无符号算数运算结果太大时,设置该标志位。
溢出标志位(OF),与目标位置相比,有符号算数运算结果太大或太小时,设置该标志位。
符号标志位(SF),算数或逻辑操作产生负结果时,设置该标志位。
零标志位(ZF),算数或逻辑操作产生地结果为零时,设置该标志位。
辅助进位标志位(AC),算数操作在8为操作数中产生了位3向位4的进位时,设置该标志位。
奇偶校验标志位(PF),结果的最低有效字节包函偶数个1时,设置该标志位,否则清除该标志位。一般情况下,如果数据有可能被修改或损坏时,该标志位用于进行错误检测。
第三章 汇编语言基础
3.1 整数常量
标号 | 说明 | 标号 | 说明 |
---|---|---|---|
h | 十六进制 | r | 编码实数 |
q/o | 八进制 | t | 十进制(备用) |
d | 十进制 | y | 二进制(备用) |
b | 二进制 |
3.2 保留字
保留字有特殊意义并且只能在内存中的保存形式为整数字节数值序列。
保留字是没有大小写之分的。
保留字有不同的类型:
1)指令助记符,如MOV、ADD和MUL
2)寄存器名称
3)伪指令,告诉汇编器如何汇编程序。
4)属性,提供变量和操作数的大小与使用信息。
5)运算符,在常量表达式中使用。
6)预定义符号,如@data,它在汇编时返回常量的整数值。
3.3 汇编语言程序模板
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data;定义变量
.code;代码区
main PROC
INVOKE ExitProcess,0
main ENDP
END main
3.4 内部数据类型
类型 | 用法 |
---|---|
BYTE | 8位无符号整数,B代表字节 |
SBYTE | 8位有符号整数,S代表有符号 |
WORD | 16位无符号整数 |
SWORD | 16位有符号整数 |
DWORD | 32位无符号整数,D代表双字 |
SDWORD | 32位有符号整数,SD代表有符号双字 |
FWORD | 48位整数(保护模式中的远指针) |
QWORD | 64位整数,Q代表四字 |
TBYTE | 80位(10字节)整数,T代表10字节 |
REAL4 | 32位(4字节)IEEE短实数 |
REAL8 | 64位(8字节)IEEE长实数 |
REAL10 | 80位(10字节)IEEE扩展实数 |
;多初始值
list BYTE 10,20,30,40,50
;定义字符串
list BYTE "GOOD AFTERNOON",0
;DUP操作符
BYTE 20 DUP(0);20个字节,值都为0
3.5 小端顺序
x86处理器在内存中按小端顺序(低到高)存放和检索数据。
第四章 数据传送、寻址和算数运算
4.1 操作数的基本类型
操作数有三种基本类型:
立即数——使用数字文本表达式
寄存器操作数——使用CPU内已命名的寄存器
内存操作数——引用内存位置
4.2 MOV指令
MOV指令的标准格式:(reg为寄存器,mem为内存操作数,imm为立即数)
mov reg,reg
mov reg,mem
mov mem,reg
mov mem,imm
mov reg,imm
目的操作数不能够是imm、CS、EIP和IP(指针寄存器)
操作数不能同为内存操作数
mov eax,val1
mov val2,eax
操作数尺寸必须相同,否则默认转换或语法错
立即数不能直接送段寄存器(16位编程常用段R)
4.3 MOVZX
(零扩展传送,只能用于无符号整数)
val word 9999h
.code
main PROC
mov eax,12345678h;eax=12345678h
mov ax,val;eax=12349999h
mov eax,12345678h;eax=12345678h
movzx eax,val;eax=00009999h
4.4 MOVSX
(符号扩展传送,只能用于