Addressing modes
Chapter 3 - Addressing modes
Operating mode
- 16 bit - 操作数、地址 16 位
- 32 bit 保护模式 - 操作数、地址 32 位
- 64 bit - 操作数 32 位、地址 64 位
MOV EAX,[RBX]
Addressing Mode
- Data-Addressing Modes -
MOV AX,DX
(把 DX 的值放到 AX 中) - Stack Memory-Addressing Modes -
PUSH AX
- Program Memory-Addressing Modes -
JMP
,CALL
3–1 DATA ADDRESSING MODES
一般来说,第一个操作数是 Destination
例外 - AT&T syntax 汇编是相反的顺序
statement 由四个部分组成
- lable - 以字母/@, $, -, or ? 起始
- opcode
- operand
- comment(; 起始)
Operands
- 立即数
- 寄存器操作数
- 内存操作数
Register Addressing
目的操作数可能不变,e.g.
CMP
TEST
指令改变状态寄存器
操作数长度不一致的情况
MOV EAX,BX
- 报错MOV BX, CX
- 只改变低 16 位
Immediate Addressing
MOV EAX,12345H
- 不同于MOV BX, CX
,前面补零- 有时候会在常数前加上
#
- 二进制末尾加 B,十六进制末尾加 H
- ASCII 码加上单引号
MOV AX, 'AB'
- Copies ASCII BA into AX (reverse order)
In MASM
MOV AX,F2H
- load a label named F2H
MOV AX,0F2H
- 装一个 16 进制数
Addressing Operand in the Memory
Effective Address = Base + (Scale×Index) + Disp
- Direct Data Addressing (Disp)
- direct addressing(专门用于 AX/AL/EAX,指令长度 3B)
MOV AL, [1234H]/DATA
(DATA 是一个位于 1234H 的 label) - displacement addressing(其他寄存器如 CX,指令长度 4B)
- direct addressing(专门用于 AX/AL/EAX,指令长度 3B)
- Register Indirect Addressing (Base)
MOV AX,[BX]
:MOV [DI], [BX]
- not allowed (除非用 string 指令)
- Base-Plus-Index Addressing (Base + Index)
- Base register - 存数组的起始地址
- index register - - relative position
MOV DX, [BX + DI]
orMOV DX, [BX][DI]
(Intel)
- Register Relative Addressing (Base/Index + Disp)
MOV AX, [BX+1000H]
- Base Relative-Plus-Index Addressing (Base + Index + Disp)
MOV AX, [BX + SI + 100H]
- Scaled-Index Addressing (Base+Scale+Index+Disp)
size directive or pointer directive
MOV [DI], 10H
- 有歧义,不知道到底存多长BYTE PTR
,WORD PTR
,DWORD PTR
orQWORD PTR
- 用法
MOV BYTE PTR [DI],10H
- 存一个 byte(不同的前缀改变 opcode 和 指令长度)
RIP Relative Addressing
- RIP - 64-bit instruction pointer
- 格式和 register relative addressing [Base + Displacement] 相似
- register is RIP
mov var[rip], edi
- register is RIP
Canonical Addressing and Canonical Form
- canonical form:48-bit 线性地址,前 16 位都是 0/1,e.g. FFFF8010BC001000/00007C80B8102040
- 如果地址是 non-canonical form
MOV RAX, [1122334455667788H]
,general-protection exception (#GP) is generated - 防止软件利用高位做其他事
AT&T vs Intel Syntax
这个感觉不重要
总结
8086-80286:
- Base: BX/BP
- Index: SI/DI
- Disp: 8-bit/16-bit
80386 and above:
- Base: any 32-bit register
- Index: any 32-bit register except ESP
- Disp: 8-bit/16-bit/32-bit
一些规则
- scale factor can be 1, 2, 4, and 8, 当有 index 才能用
- BP/EBP or ESP is used,默认用 SS 段寄存器
选择基地址
BP/ESP 优先作为基地址
80386 - ESP cannot be used as an index register
3-2 PROGRAM MEMORY ADDRESSING MODES
- jmp/call instruction
- jump offset:
- relative offset (label, 机器码层面放在 EIP register as a signed displacement relative to PC)
JMP start
- absolute offset (放在 general-purpose register or a memory location,相对于 code segment)
JMP AX
- relative offset (label, 机器码层面放在 EIP register as a signed displacement relative to PC)
- four different types of jumps:
- short jump - -128 to +127 相对于 EIP
- near jump - 段内跳
JMP NEAR PTR [BX]
- far jump - 可以跳到段外(same privilege level)
JMP 1234:5678
JMP FAR PTR START
- 实模式下前 1MB
- 保护模式下 4GB
- task switch - 跳到不同的 task (in protected mode only)
3–3 STACK MEMORY-ADDRESSING MODES
栈从高地址向低地址生长,因此多字节情况下,高的数据部分先入栈 - 小端模式
- Register addressing - 把寄存器存入栈中
- Memory-addressing - 把某个内存里的数据存入栈中
- Immediate addressing - 把立即数存入栈中
- Segment register addressing - 把段寄存器存入栈中
- flags
Stack memory is maintained by two registers:
- the stack segment register (SS)
- the stack pointer (SP or ESP)
栈的初始化
PUSH -