Skip to content

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

  • 立即数
  • 寄存器操作数
  • 内存操作数

alt text

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)
  • Register Indirect Addressing (Base)
    • MOV AX,[BX]: alt text
    • MOV [DI], [BX] - not allowed (除非用 string 指令)
  • Base-Plus-Index Addressing (Base + Index)
    • Base register - 存数组的起始地址
    • index register - - relative position
    • MOV DX, [BX + DI] or MOV DX, [BX][DI] (Intel) alt text
  • Register Relative Addressing (Base/Index + Disp)
    • MOV AX, [BX+1000H] alt text
  • Base Relative-Plus-Index Addressing (Base + Index + Disp)
    • MOV AX, [BX + SI + 100H]
  • Scaled-Index Addressing (Base+Scale+Index+Disp)
    • alt text

size directive or pointer directive

  • MOV [DI], 10H - 有歧义,不知道到底存多长
  • BYTE PTR, WORD PTR, DWORD PTR or QWORD 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

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

这个感觉不重要

总结

alt text

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)alt text
    • JMP start
    • absolute offset (放在 general-purpose register or a memory location,相对于 code segment)
    • JMP AX
  • four different types of jumps:
    • short jump - -128 to +127 相对于 EIP
    • near jump - 段内跳 JMP NEAR PTR [BX] alt text
    • 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)

栈的初始化

STACK_SEG SEGMENT STACK 
    DW   100H  DUP(?) 
STACK_SEG ENDS

PUSH -