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