計算機系統結構cpu內部:
1. pc program counter
指令指標暫存器
指向下一條指令的位址
eip(x86-32)或者
rip(x86-64)
2. 暫存器與暫存器堆
registers
在處理器cpu內部以名字來訪問的快速儲存單元
3. 條件狀態碼
condition codes
用於儲存最近執行指令的結果狀態資訊
用於條件指令的判斷執行
記憶體單元memory:
以位元組編碼的連續儲存空間
儲存程式**、資料、執行棧stack 以及作業系統資料組合語言資料格式c 語言
彙編**:
addl 8(%ebp) %eax//l表示雙字 8是位偏移量
運算元:
x: 暫存器 register eax
y: 記憶體 memory m[ebp+8] ebp是函式棧基址暫存器
t: 暫存器 register eax
結果t儲存在暫存器eax中
類似於表達:
x += y
或者:int eax;
int* ebp;
eax += ebp[2];//這裡按位元組資料傳送指令movel 源地 目的地
將乙個雙字從源地移動到目的地
允許的運算元型別有:
立即數imm:常整數
如: $0x400, $-533
可以用1,2或4個位元組來表示
暫存器 reg:
8個通用暫存器之一
%eax
%ebx
%ecx
%edx
%esi
%edi
%esp 棧頂
%ebp 棧底
儲存器mem:四個連續的位元組
彙編 類似c語言
立即數--->暫存器 movl $0x41, %eax temp = 0x41;
立即數--->記憶體 movl $-43, (%eax) *p = -43;
暫存器--->暫存器 movl %eax, %edx temp2 = temp;
暫存器--->記憶體 movl %eax, (%edx) *p = temp;
記憶體 --->暫存器 movl (%eax), %edx temp = *p;
不允許記憶體到記憶體 簡單得定址模式1. 間接定址 (r) mem[reg[r]]
暫存器r 指定得記憶體位址
movl (%ecx), %eax
2. 基址+偏移量 定址 d(r) mem[reg[r] + d]
暫存器r 指定記憶體的起始位址
常數d 給出偏移位址
movl 8(%ebp), %ecx定址模式使用示例交換兩個數
c語言void swap(int* xp, int* yp)
組合語言分析
暫存器 變數:
%ecx yp
%edx xp
%eax t1
%ebx t0
對應彙編:
movl 12(%ebp),%ecx # ecx = yp 是位址 放到ecx暫存器中
movl 8(%ebp), %edx # edx = xp 是位址 放到edx暫存器中
movl (%ecx), %eax # eax = *yp t1 值 取暫存器中位址指向的記憶體位址中的內容放入 暫存器eax中
movl (%edx), %ebx # ebx = *xp t0 值 取暫存器中位址指向的記憶體位址中的內容放入 暫存器ebx中
movl %eax, (%edx) # *xp = eax 交換內容放入原來記憶體指向得位址中
movl %ebx, (%ecx) # *yp = ebx
ebp 是函式棧 基位址
ebp+8 的位置 儲存 指標xp 指向記憶體的乙個位址
ebp+12 的位置 儲存 指標yp 指向記憶體的乙個位址變址定址常見形式:
d(rb,ri,s) mem[reg[rb] + s*reg[ri] + d]
d: 常量(位址偏移量)
rb: 基址暫存器:8個通用暫存器之一
ri: 索引暫存器: %esp不作為索引暫存器
一般%ebp也不做這個用途
s: 比例因子, 1,2,4,8
其他變形:
d(rb,ri) mem[reg[rb] + reg[ri] + d]
(rb,ri) mem[ reg[rb] + reg[ri] ]
(rb,ri) mem[reg[rb] + s*reg[ri]]位址計算指令 leal , lea +lleal src, dest
src 是位址計算表示式子 d(rb,ri,s) ---> reg[rb] + s*reg[ri] + d
計算出來得位址賦給 dest
使用例項:
位址計算,無需訪問記憶體 auto *p = &x[i];
進行x+k*y這一型別得整數計算,k = 1,2,4,8整數計算指令:addl src,dest # dest = dest + src #加法
subl src,dest # dest = dest - src #減法
imull src,dest # dest = dest * src #乘法
sall src,dest # dest = dest << src #左移位 等價於shll
sarl src,dest # dest = dest >> src #算術右移位 補 被移動數的最高位
shrl src,dest # dest = dest >> src #邏輯右移位 左邊單純補 0
xorl src,dest # dest = dest ^ src #按位異或
andl src,dest # dest = dest & src #按位與
orl src,dest # dest = dest | src #按位或
incl dest # dest = dest + 1 #++ 自增1
decl dest # dest = dest - 1 #-- 自減1
negl dest # dest = - dest # 取非
notl dest # dest = ~ dest # 取反
作業系統組合語言之AT T指令
計算機系統結構cpu內部 1.pc program counter 指令指標暫存器 指向下一條指令的位址 eip x86 32 或者 rip x86 64 2.暫存器與暫存器堆 registers 在處理器cpu內部以名字來訪問的快速儲存單元 3.條件狀態碼 condition codes 用於儲存...
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...
組合語言之轉移指令
轉移指令 可以修改ip或同時修改cs和ip的指令統稱為轉移指令。短轉移ip的修改範圍 128 127 近轉移ip的修改範圍 32768 32767 1.操作符offset 例 assume cs codesg codesg segment start mov ax,offset start 相當於 ...