作業系統組合語言之AT T指令

2021-10-03 05:10:26 字數 3214 閱讀 7353

計算機系統結構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 相當於 ...