寄存器
eax | Accumulator | 累加器 |
---|---|---|
ebx | Base register | 基寄存器 |
ecx | Counter register | 计数器寄存器 |
edx | Data register - can be used for I/O port access and arithmetic functions | 数据寄存器-可用于I/O端口访问和算术函数 |
esi | Source index register | 源索引寄存器 |
edi | Destination index register | 目标索引寄存器 |
ebp | Base pointer register | 基指针寄存器 |
esp | Stack pointer | 堆栈指针 |
所有的整数寄存器均为32位。但是,其中这么多都有16位或8位子寄存器
寄存器 | 子寄存器 | 位置说明 |
---|---|---|
eax | ax | 低16位 |
ah | 高16位 | |
al | 低8位 | |
ebx | bx | 低16位 |
bh | 高16位 | |
bl | 低8位 | |
ecx | cx | 低16位 |
ch | 高16位 | |
cl | 低8位 | |
edx | dx | 低16位 |
dh | 高16位 | |
dl | 低8位 | |
esi | si | 低16位 |
edi | di | 低16位 |
ebp | bp | 低16位 |
esp | sp | 低16位 |
注意:在WinDbg使用”?“(Evaluate Expression)查看子寄存器时,子寄存器前要加“@”符号,如? @ax ,而不是 ? ax。但用“r”(Registers)命令时,不需要“@”符号
eip | Instruction pointer | 指令指针,正在执行的指令的地址 |
---|---|---|
flags | flags | 标志位 |
调用约定
x86体系结构具有多个不同的调用约定。但都遵循相同的寄存器保留和函数返回规则:
- 函数必须保留所有寄存器,但eax、ecx和edx除外(可在函数调用中更改),esp(必须根据调用约定进行更新)
- 如果结果为32位或更小,则eax寄存器为返回值。如果结果为64位,则结果存储在edx:eax中。
x86体系结构上使用的调用约定:
- Win32(__stdcall)
函数参数在堆栈上传递,从右向左推送,被调用方清理堆栈。 - 本机C++方法调用(也称为thiscall)
函数参数在堆栈上传递,从右向左推送,"this"指针在ecx寄存器中传递,被调用方清理堆栈。 - COM(适用于c++的__stdcall)
- __fastcall
前两个DWORD或较小的参数在ecx和edx寄存器中传递,其余参数在堆栈上传,从右向左推送。被调用方清理堆栈。 - __cdecl
函数参数在堆栈上传递,从右向左推送,被调用方清理堆栈。__cdecl调用约定用于具有可变长度参数的所有函数。
x86标志位
(图片引用自:https://blog.csdn.net/weixin_46013401/article/details/111823010)
标志 代码 | 标志名称 | 值 | 状态与说明 | 其它 |
---|---|---|---|---|
OF | Overflow Flag 溢出标志 | 0 1 | nv-No overflow(无溢出) ov-Overflow(溢出) | 有符号数 |
DF | Direction Flag 方向标志 | 0 1 | up-Direction up(递增,低往高) dn-Direction down(递减,高往低) | 仅仅用于串处理指令中, 控制SI、DI的改变方向 CLD指令:将DF置为0 STD指令:将DF置为1 |
IF | Interrupt Flag 中断标志 | 0 1 | di-Interrupts disabled(禁用中断) ei-Interrupts-enabled(启用中断) | STI指令:将IF设置为1 CLI指令:将IF设置为0 |
SF | Sign Flag 符号标志 | 0 1 | pl-Positive(or zero)正或零 ng-Negative(负数) | 结果为负数,则SF=1 结果为非负,则SF=0 |
ZF | Zero Flag 零标志 | 0 1 | nz-Nonzero(非零) zr-Zero(零) | 结果为零,则ZF=1 结果为非零,则ZF=0 |
AF | Auxiliary Carry Flag 辅助进位标志 | 0 1 | na-No auxiliary carry(无辅助进位) ac-Auxiliary carry(辅助进位) | 反映加减运算时最低半字节有无进位或者借位 最低半字节有进位或借位时,AF=1, 否则AF=0。 |
PF | Parity Flag 奇偶标志 | 0 1 | pe-Parity even(奇) po-Parity odd(偶) | 所有bit位中的1的个数是否为偶数 偶数:则PF=1,奇数:则PF=0 |
CF | Carry Flag 进位标志 | 0 1 | nc-No carry(无进位) cy-Carry(有进位) | 无符号数 有进位或借位时CF=1,否则为0 |
TF | Trap Flag 跟踪标志 | 0 1 | 0-正常状态 1-单步状态 | 是否允许单步中断 |
iopl | I/O Privilege Level | 00~11 | 操作系统用来控制对硬件的访问 |
用"r"命令查看或更改标志位的值
条件Conditions
条件描述一个或多个标志的状态。
汇编程序使用一个或两个字母缩写来表示条件。
条件名称 | 标志 | 说明 |
---|---|---|
Z | ZF=1 | 最后一个操作的结果为零 |
NZ | ZF=0 | 最后一个操作的结果不为零 |
C | CF=1 | 最后一个操作进位或借位(对于无符号整数,表示溢出) |
NC | CF=0 | 最后一个操作不需进位或借位 |
S | SF=1 | 最后一个操作具有高位集 |
NS | SF=0 | 最后一个操作没有高位集 |
O | OF=1 | 当视为有符号整数运算时,最后一个运算导致溢出 |
NO | OF=0 | 当视为有符号整数运算时,最后一个运算没有溢出 |
条件还可以用于比较两个值。cmp指令比较其两个操作数,然后设置标志,类似从一个操作数减去一个操作数。
条件名称 | 标志 | CMP操作后的含义 |
---|---|---|
E | ZF=1 | value1 == value2 |
NE | ZF=0 | value1 != value2 |
GE、NL | SF=OF | value1 >= value2(有符号整数) |
LE、NG | ZF=1 or SF!=OF | value1 <= value2(有符号整数) |
G、NLE | ZF=0 and SF=OF | value1 > value2 (有符号整数) |
L、NGE | SF!=OF | value1<value2(有符号整数) |
AE、NB | CF=0 | value1 >= value2 (无符号整数) |
BE、NA | CF=1 or ZF =1 | value1 <= value2(无符号整数) |
A、NBE | CF=0 and ZF=0 | value1 > value2 (无符号整数) |
B、NAE | CF=1 | value1 < value2 (无符号整数) |
条件通常用于处理cmp 或 test 指令的结果。
数据类型
- byte:8 bits
- word:16 bits
- dword:32 bits
- qword:64 bits(包括浮点双精度)
- tword:80 bits(包括浮点扩展双精度)
- oword:128 bits
符号
表示法 | 含义 |
---|---|
r,r1,r2… | 寄存器 |
m | 内存地址 |
#n | 即时常量 |
r/m | 寄存器或内存地址 |
r/#n | 寄存器或即时常量 |
r/m/#n | 寄存器/内存地址/即时常量 |
cc | 条件代码 |
T | “B”,“W” or “D” (byte,word,dword) |
accT | T大小的累加器 T=“B”,则为al;T=“W”,为ax;T=“D”,为eax |
寻址模式
采用 T PTR [expr]的形式寻址,其中T是某种数据类型,expr是涉及常量和寄存器的一些表达式。
图片来源于网络
引用:
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/x86-architecture
https://blog.csdn.net/weixin_46013401/article/details/111823010