c語言有不同的資料格式,如char,short,int,long等。組合語言針對不同資料有不同的操作碼形式,如movb(傳送位元組),movw(傳送字),movl(傳送雙字)。本篇及後面幾篇文章皆採用32位的intel格式,如下圖所示:
intel資料型別
彙編**字尾
大小(位元組)位元組b
1字w2
雙字l4單精度s4
雙精度l
8資料傳送指令的目的是將源運算元的值複製到目的運算元中。源運算元是乙個立即數,在暫存器或者儲存器中。目的運算元是乙個位址,可以是暫存器或者儲存器位址。ia32指令集的資料傳送指令如下圖所示。
符號擴充套件是指目的位置的所有高位用源值的最高位數值進行填充。零擴充套件是指目的位置的所有高位用零填充。用下面幾個例子加強理解。
序號指令結果1
movl $0x4050,%eax
imm->reg, 4bytes
2movw %bp,%sp
reg->reg,2bytes
3movb (%edi,%ecx),%ah
mem->reg,1byte
4movb $-17,(%esp)
imm->mem,1byte
5movl %eax,-12(%ebp)
reg->mem,4bytes
6以下假設%dh=cd,%eax=98765432
7movb %dh,%al
%eax=987654cd
8movsbl %dh,%eax
%eax=ffffffcd
9movzbl %dh,%eax
%eax=0000000cd
處理器執行一條指令流程可簡單分為:取指令,解碼,執行,訪存,寫回,更新pc(程式計數器,即當前指令位址)。
取指令:處理器從pc指定的位址取出一條指令。一條指令由指令**以及暫存器運算元ra或rb構成,有的指令還包含乙個常數valc。下一條指令的位址valp等於pc的值加上取出指令的長度。
解碼:將ra或rb指定的暫存器值賦值給vala或valb。
執行:算術/邏輯單元(alu)根據指令**指明的操作,計算相關資料,把結果放在valc中。
訪存:處理器將結果寫入儲存器,或從儲存器中讀出資料,賦值給valm。
寫回:將結果寫回到暫存器中。
更新pc:將pc設定成下一條指令的位址。
下面將mov指令執行過程按上面步驟進行拆解,假設指令**大小為1個位元組,暫存器ra:rb占用乙個位元組,常數占用四個位元組:
階段movl ra, rb
movl imm, rb
取指令icode = m[pc]
ra:rb=m[pc+1]
valp=pc+2
icode = m[pc]
ra:rb=m[pc+1]
valc=m[pc+2]
valp=pc+6
解碼vala=r[ra]–執行
vale=0+vala
vale=0+valc訪存–
–寫回r[rb]=vale
r[rb]=vale
更新pc
pc=valp
pc=valp
組合語言 傳送指令
一.傳送指令 1.通用傳送指令mov mov dst,src 將src傳送到dst中 dstsrc操作位數 mem reg imm8 16 mem reg seg reg8 16 reg seg mem 8 16 mem reg seg 8 16 imm是立即數,reg是暫存器,seg是段暫存器,m...
組合語言之指令系統 2 資料運算指令
算數運算指令 指令系統是組合語言學習的基礎,上次介紹了運算元定址指令,這次以x86彙編為基礎繼續總結資料運算類指令 1 mov 指令 格式 mov 目標 源 舉幾個例子 mov ax 5 把立即數傳送給暫存器ax mov ax bx 把bx中的值傳送給ax mov ebx eax 把暫存器eax中的...
組合語言之轉移指令
轉移指令 可以修改ip或同時修改cs和ip的指令統稱為轉移指令。短轉移ip的修改範圍 128 127 近轉移ip的修改範圍 32768 32767 1.操作符offset 例 assume cs codesg codesg segment start mov ax,offset start 相當於 ...