彙編學習記錄之八

2021-09-01 16:01:28 字數 1520 閱讀 9198

1.機器指令處理的資料所在位置

絕大部分機器指令都是進行資料處理的指令,處理大致可以分為三類:讀取、寫入、運算。

在機器指令這一層來講,並不關心資料的值是多少,而關心指令執行前一刻,它將要處理的資料的所在位置。

指令執行前,所要處理的資料可以在三個地方:cpu內部、記憶體、埠。

2.組合語言中資料位置的表達

(2.1)立即數(idata)

對於直接包含在機器指令中的資料(執行前在cpu的指令緩衝器中),在組合語言中稱為:立即數(idata),在彙編指令中直接給出。

例如:mov ax, 1

add bx, 2000h

(2.2)暫存器

指令要處理的資料在暫存器中,在彙編指令中給出相應的暫存器名。

例如:mov ax, bx

mov ds, ax

(2.3)段位址(sa)和偏移位址(ea)

指令要處理的資料在記憶體中,在彙編指令中可用[x]的格式給出ea,sa在某個段暫存器中。

mov ax, [0]

mov ax, [di]

等指令,段位址預設在ds中;

mov ax, [bp]

mov ax, [bp+si]

等指令,段位址預設在ss中。

mov ax, ds:[bp]

mov ax, es:[bx+si]

3.8086cpu可以處理兩種尺寸的資料,byte和word。所以在機器指令中要指明,指令進行的是字操作還是位元組操作。

對於這個問題,組合語言中用以下方法處理。

(3.1)通過暫存器名指明要處理的資料的尺寸。

例如:下面的指令中,暫存器指明了指令進行的是字操作:

mov ax, 1

mov bx, ds:[0]

mov ds:[0], ax

下面的指令中,暫存器指明了指令進行的是位元組操作:

mov al, 1

mov al, ds:[0]

mov ds:[0], bl

(3.2)在沒有暫存器名的情況下,用操作符x ptr指明記憶體單元的長度,x在彙編指令中可以為word或byte。

例如:下面的指令中,用word ptr指明了指令訪問的記憶體單元是乙個字單元:

mov word ptr ds:[0], 1

inc word ptr [bx]

add word ptr ds:[0], 2

下面的指令中,用byte ptr指明了指令訪問的記憶體單元是乙個位元組單元:

mov byte ptr ds:[0], 1

inc byte ptr [bx]

add byte ptr [bx], 2

在沒有暫存器參與的記憶體單元訪問指令中,用word ptr或者byte ptr顯性地指明所要訪問的記憶體單元的長度是很必要的。否則cpu無法得知所要訪問的單元是字單元,還是位元組單元。

(3.3)其他方法

有些指令預設了訪問的是字單元還是位元組單元,比如:push [1000h]就不用指明訪問的單元是字單元還是位元組單元,因為push指令只進行字操作。

有錯誤請指正,謝謝!

彙編學習記錄之六

1.源程式例子 assume cs codesg codesg segment start mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h codesg ends end start在組合語言源程式中,包含兩種指令...

彙編學習記錄之十

1.轉移指令的原理 可以修改ip,或者同時修改cs和ip的指令統稱為轉移指令。概括地講,轉移指令就是可以控制cpu執行記憶體中某處的 的指令。8086cpu的轉移行為有以下幾類 1.1 只修改ip時,稱為段內轉移,比如 jmp ax 1.2 同時修改cs和ip時,稱為段間轉移,比如 jmp 1000...

彙編學習記錄

加粗樣式今天看到了驅動開發教程裡的中斷這一章了,結果課本直接先來一段組合語言,然而我早已把彙編忘得一乾二淨了,無奈只能重新再學一下了 cpsr是記錄當前的工作模式的狀態暫存器,在超級使用者模式下,可以用如下指令改變當前使用者模式 mov r3 0xd3 不能直接用立即數直接對cpsr暫存器賦值,必須...