; 給開發(fā)人員看的偽指令茫多。 code(也可以命名為其他)表示cs ......
assume cs:code, ds:data, ss:stack
; 棧段
stack segment
;100個(gè)單位的數(shù)據(jù) 并且全都賦值為0
db 100 dup(0)
stack ends
; 數(shù)據(jù)段
data segment
db 100 dup(0)
data ends
; 代碼段
code segment
; 程序的入口
start:
; 手動(dòng)將data和stack賦值給寄存器ds和ss天揖,而cs不需要賦值因?yàn)樵趀nd 的時(shí)候告訴編譯器start是程序的入口跪帝,所以code就是代碼段。
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
; 給寄存器賦值
mov si, 1
mov di, 2
mov bx, 3
mov bp, 4
; 將1伞剑,2作為參數(shù)入棧 棧頂指針sp-4
push 1
push 2
; 調(diào)用sum函數(shù),此時(shí)會(huì)自動(dòng)入棧sum函數(shù)之后的即將執(zhí)行的下一條指令的地址sp-2
call sum
; 平棧
add sp, 4
; 代碼執(zhí)行結(jié)束 int 是終端指令 當(dāng)為21h的時(shí)候并且ah為4c的時(shí)候表示程序執(zhí)行結(jié)束
mov ax, 4c00h
int 21h
; sum函數(shù)
sum:
; bp的地址入棧 以保存bp的原始值
push bp
; bp保存sp的值
mov bp, sp
; sp-10 空出10個(gè)字節(jié)的空間給局部變量使用
sub sp, 10
; 將寄存器入棧
push si
push di
push bx
; 給局部變量空間填充int 3(CCCC)
; stosw的作用:將ax的值拷貝到es:di中,同時(shí)di的值會(huì)+2
mov ax, 0cccch
; 讓es等于ss
mov bx, ss
mov es, bx
; 讓di等于bp-10(局部變量地址最小的區(qū)域)
mov di, bp
sub di, 10
; cx決定了stosw的執(zhí)行次數(shù)
mov cx, 5
; rep的作用:重復(fù)執(zhí)行某個(gè)指令(執(zhí)行次數(shù)由cx決定)
rep stosw
; 定義2個(gè)局部變量
mov word ptr ss:[bp-2], 3
mov word ptr ss:[bp-4], 4
mov ax, ss:[bp-2]
add ax, ss:[bp-4]
mov ss:[bp-6], ax
; 訪問棧中參數(shù)
mov ax, ss:[bp+4]
add ax, ss:[bp+6]
add ax, ss:[bp-6]
; 恢復(fù)寄存器的值
pop bx
pop di
pop si
; 恢復(fù)sp
mov sp, bp
; 恢復(fù)bp
pop bp
ret
code ends
end start
上述代碼實(shí)現(xiàn)了下面c語(yǔ)言的功能
int sum (int a, int b) {
int c = 3;
int d = 4;
int e = c + d;
return a + b + e;
}
int main() {
sum(1, 2);
return 0;
}
sum函數(shù)執(zhí)行的流程
1.push 參數(shù)
2.push 函數(shù)的返回地址
3.push bp (保留bp之前的值,方便以后恢復(fù))
4.mov bp, sp (保留sp之前的值雪营,方便以后恢復(fù))
5.sub sp,空間大小 (分配空間給局部變量)
6.保護(hù)可能要用到的寄存器
7.使用CC(int 3)填充局部變量的空間
8.--------執(zhí)行業(yè)務(wù)邏輯--------
9.恢復(fù)寄存器之前的值
10.mov sp, bp (恢復(fù)sp之前的值)
11.pop bp (恢復(fù)bp之前的值)
12.ret (將函數(shù)的返回地址出棧衡便,執(zhí)行下一條指令)
13.恢復(fù)棧平衡 (add sp,參數(shù)所占的空間)
8086匯編的相關(guān)筆記來(lái)自 小碼哥 MJ iOS底層視頻 以及 王爽《匯編語(yǔ)言(第三版)》