汇编语言全览教程
基礎(chǔ)知識(shí)
機(jī)器語(yǔ)言
機(jī)器語(yǔ)言是 011 組成的,能直接對(duì) CPU 發(fā)送指令的語(yǔ)言。早期程序員通過卡片打孔控制機(jī)器。這樣的程序難以編輯。
匯編語(yǔ)言的產(chǎn)生
匯編語(yǔ)言和機(jī)器語(yǔ)言是逐行一一對(duì)應(yīng)的。例如:
- 操作:寄存器BX內(nèi)容放進(jìn)AX
- 機(jī)器:1000100111011000
- 匯編:mov ax, bx
寄存器就是 CPU 中可以存儲(chǔ)數(shù)據(jù)的原件, AX 和 BX 都是寄存器代號(hào)。
匯編語(yǔ)言需要通過編譯器轉(zhuǎn)換成機(jī)器碼。
匯編語(yǔ)言的組成
- 匯編指令:實(shí)際的操作指令,直接轉(zhuǎn)換成機(jī)器碼
- 偽指令:類似 C 中的 #define, 沒有對(duì)應(yīng)的機(jī)器碼,編譯器負(fù)責(zé)執(zhí)行
- 其他符號(hào):例如 + - * /
存儲(chǔ)器
就是內(nèi)存,存儲(chǔ)指令和數(shù)據(jù)。
指令和數(shù)據(jù)
在內(nèi)存或者磁盤上都是一樣的二進(jìn)制編碼,根據(jù)馮諾依曼結(jié)構(gòu),有的看做指令,有的看做數(shù)據(jù)。
例如
- 內(nèi)容:1000100111011000
- 數(shù)據(jù):89D8H
- 程序:mov ax, bx
存儲(chǔ)單元
從 0 開始編號(hào), 8bit = 1byte 。
CPU 對(duì)存儲(chǔ)器的讀寫
需要提供以下信息:
- 存儲(chǔ)單元的地址信息
- 讀寫、器件的控制信息
- 數(shù)據(jù)信息
通過總線傳遞數(shù)據(jù)。
地址總線
其寬度決定了能發(fā)送的地址位長(zhǎng)度。
數(shù)據(jù)總線
同理,一次傳輸總線寬度位。
控制總線
CPU 能發(fā)送的對(duì)器件的控制代碼。
內(nèi)存地址空間
CPU 的地址總線寬度為 10 ,可以尋址 1024 個(gè)內(nèi)存單元,這就對(duì)應(yīng)內(nèi)存地址空間。
可以把后面提到的各種存儲(chǔ)器都看做同一個(gè)邏輯存儲(chǔ)器。把地址段不同部分分配給不同的器件。
主板
通過總線和插槽鏈接器件。
接口卡
CPU 可以發(fā)送控制和數(shù)據(jù)讀寫命令。如顯卡。
存儲(chǔ)器芯片
- 隨機(jī)存儲(chǔ)器
- BIOS 和 ROM
- 接口卡上的 RAM
寄存器
功能:
- 運(yùn)算器處理信息
- 寄存器存儲(chǔ)信息
- 控制器控制器件
- 內(nèi)部總線傳輸數(shù)據(jù)
8086 有 14 個(gè)寄存器,分別是 AX BX CX DX SI DI SP BP IP CS SS DS ES PSW 。
通用寄存器
有 AX BX CX DX ,分別有 16 位,可以分開當(dāng) AH AL 這樣的高低位使用,互不影響。
字在寄存器中的存儲(chǔ)
一個(gè)字 Word 16 位 = 兩個(gè)字節(jié) Byte 8 位。
一些匯編指令
- 匯編 mox ax, 18 高級(jí)語(yǔ)言 AX=18
- 匯編 add ax, 8 高級(jí)語(yǔ)言 AX = AX+8
- 匯編 add ax, bx 高級(jí)語(yǔ)言 AX=AX+BX
物理地址
需要通過邏輯地址計(jì)算得出
16位結(jié)構(gòu)CPU
8086 是 16 位的,特點(diǎn):
- 運(yùn)算器一次出處理 16 位數(shù)據(jù)
- 寄存器最大寬度 16 位
- 寄存器、運(yùn)算器通路 16 位
8086 得到物理地址
有 20 位地址總線,1MB尋址能力,但是內(nèi)部能處理的地址只有16位。但是可以合成20位地址。
- 提供段地址和偏移地址
- 利用地址加法器相加
準(zhǔn)確的說,物理地址=段地址x16+偏移地址。
段的概念
內(nèi)存并沒有分段,但是 CPU 做了分段。但是分段可以是任意自己制定的。
段寄存器
CS DS SS ES
CS和 IP
CS 是代碼段寄存器, IP 是指令指針寄存器,任意時(shí)刻執(zhí)行的代碼就是 CS:IP 。
修改CS和IP的指令
不能夠直接 mov 修改,如果同時(shí)修改用
JMP 段地址:偏移地址 ,只修改 IP 的話用 JMP 某個(gè)寄存器 。
代碼段
代碼會(huì)被自動(dòng)存入內(nèi)存,但是并不會(huì)被 CPU 自動(dòng)識(shí)別為指令而非數(shù)據(jù),所以需要 JMP 跳到代碼段開頭。
寄存器
內(nèi)存中字存儲(chǔ)
字單元 DWORDL兩個(gè)連續(xù)的內(nèi)存單元,高地址存高位,低地址存地位。例如數(shù)據(jù) 20000 = 4E20H , 0 位存 20H (低), 1 位存 4EH (高)。
DS 和[address]
DS 通常存要訪問的數(shù)據(jù)的段地址。
mov bx, 1000H ; ds 是不能直接放入數(shù)據(jù)的,所以要用 bx 中轉(zhuǎn)。
mov ds, bx ; 段地址
mov al, [0] ; [0]默認(rèn)是基于ds的偏移,所以實(shí)際上代表 1000:0 位置。
字的傳送
只要目標(biāo)是 16 位就行。
mov add sub 指令
mov 寄存器 數(shù)據(jù)/寄存器/內(nèi)存單元
mov 內(nèi)存單元/段寄存器 寄存器
記住何時(shí)需要寄存器中轉(zhuǎn)即可。
數(shù)據(jù)段
用 ds 存放數(shù)據(jù)段段地址, 用 [] 縮寫訪問偏移。
CPU 提供的棧機(jī)制
SS:SP 指向棧頂, SS 指向棧。
PUSH AX 進(jìn), POP AX 出。
例如,初始狀態(tài) SS=1000H , SP=0020H, SS:SP=10020H 也就是棧底。 PUSH 8 次字 (占位置 16 字節(jié), 10H 個(gè)位置) 后, SS:SP=10010H 。
8086 沒有保證棧不超界的設(shè)計(jì)。
第一個(gè)程序
源碼從寫出到執(zhí)行
- 編寫代碼
- 編譯連接:可執(zhí)行文件包括描述信息和程序本身
- 執(zhí)行
源程序
assume cs:codeseg ; 關(guān)聯(lián)寄存器和代碼段
codesg segement ; 定義語(yǔ)句段...mov ax,4c00Hint 21H ; 程序返回
codeseg ends
end
編譯和連接
根據(jù)具體使用IDE而定。
BX 和 loop 指令
總結(jié)
- 上一篇: HDU.6761.Minimum Ind
- 下一篇: HDU - 6756 Finding a