學 彙編語言 -- 王爽 筆記
-- munds
1: 計算機是由 cpu,內存,外部儲存器,主板,等等 組成
2: cpu 經過 數據總線,地址總線,控制總線 來與外部設備交流
3: cpu 經過 統一地址總線 來控制 各大部件
4: cpu 經過 數據總線 接收和發送 數據到 內存
5: 某些cpu 經過 DMA 來控制 速度比較慢的設備 好比 硬盤,軟盤,光盤 等
------------------------------- 廢話分割線 ------------------------------------------------------------------------------------------------
cpu 經過各類寄存器來儲存臨時信息
寄存器有: ax,bx,cx,dx,cs,ds,ss,es
cpu運行一條指令的詳細動做是 : 1 從cs寄存器中取值 ,2 把給值做爲內存地址發送到地址總線上,3 內存器給cpu發送該地址的內容 ,4 cpu處理內容(這個內容就是計算機指令)
在8086中 全部的寄存器都是16位,在 80386 中 全部的寄存器都是 32位
ax,bx,cx,dx 都是 能夠分爲 al,ah,等的8位寄存器
ax = ah x 2^8 + al
cpu能夠單獨的對 al ,ah等8位寄存器直接操做
cpu 能夠直接往控制總線上面發送 獨立顯卡的 所處在的地址 就能夠往屏幕上面顯示東西拉 ^ _ ^
---------------------------段地址,基地址的概念理解 ------------------------------------------------------------------------------------
注意: 8086的地址總線是20位的,而數據總線是16位的,那麼 cpu該怎麼去定位一個地址呢? 是直接從16位寄存器中拿出內容,直接把這個內容發送到地址總線上?,可是 寄存器不是16位的嗎? 還差四位呀!!!!
因而 8086這些逗比設計員 就把定位一個真正物理地址設計成兩部分 1: 段地址 2:基地址 。實際地址 = 段地址 x 16 + 基地址
好吧,這樣也行,我也醉了
可是我該怎麼去從一個內存提取信息呢?
下面咱們來看一個例子:
assume cs:code //assume :僞代碼 用於給程序員識別 並不會被彙編器編譯爲機器碼
code segment: // 是
mov ax,0x1000 // 給 ax 賦值
mov ds,ax // 由於 ds 不能夠直接接收 當即數 因此 用 ax 做爲中間者爲ds 設值
mov bx,0x20 //
mov ax,[bx] //
ends //
這個例子中 ax 做爲中間變量 爲 ds 設值
注意ds爲段地址寄存器 而 mov ax,[bx] 這條指令是從 0x1000 x 16 + 0x20 = 0x10020 的地址中取兩個字節到ax寄存器。
--------------------------柞堆的理解 ----------------------------------------------------------------------------------------------------
8086中經常使用 ss 做爲 柞的段地址,sp 做爲 柞的柞頂 柞示意圖: | 0x1000b | <-- sp指向一個內存空間
例子: | 0x1000a | push : 先把sp柞頂寄存器減二
assume cs:code ss:stack | 0x10009 | 再把 ax寄存器中的值壓入柞中
code segment: | 0x10008 |
mov ax,0x1000 | 0x10007 | pop : 先從柞中抽出內容
mov ss:ax | 0x10006 | 再把sp寄存器中的值減二
mov ax,0x0b | 0x10005 |
mov sp,ax | 0x10004 |
mov ax,10000 | 0x10003 |
push ax | 0x10002 |
這個例子中 先初始化ss寄存器的值,選定一塊地址做爲柞 內存 | 0x10001 |
而後初始化sp寄存器的值, 初始化 柞頂爲柞底 | 0x10000 |
| 0x0ffff | <-- 柞頂
--------------------------8086彙編語言中的各個段---------------------------------------------------------------------------------------------
一: 代碼段
cs :提醒程序員 這裏是程序的入口 真正的程序入口是由 start 僞代碼決定的
二: 數據段
ds :數據段,能夠定義程序的緩存數據所在的地址,大小,(通常在程序代碼段的前面125字節處)
三: 柞段
ss :設置柞所在的內存的數據
四: 僞代碼
segment :程序員爲標籤後面代碼的地方作一個標誌 s1: mov ax,10000 //s1表明 「mov ax,10000" 所在的地址
start : 整個程序的第一個命令入口 用於程序被加載完進內存後設置 cs寄存器的值
--------------------------常見的8086彙編命令 -----------------------------------------------------------------------------------------------
命令 例子
mov R1,idata/R2: modifi of value R1=idata/R2 mov ax,1000 // ax=1000
add R2,R3/idata add 增長 add ax, 1000 // ax=ax+1000
inc REG 至關於c語言裏面的自加運算 REG++ inc bx // bx 加一
int int 中斷 int 21h //產生中斷
loop segment 循環 s1: inc ax
-----
-----
loop s1 // 返回 s1 處 作循環
sub R1,R2: 減法 R1=R2-R1 sub ax,bx // ax = bx - ax
push REG : 入柞 push ax, //把ax寄存器的值壓入 ss:sp中
pop REG : 取值 pop ax, //往 ss:sp 中取值並送入ax中
程序員