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暫存器賦值,必須...