資料傳送指令

2022-06-08 23:03:14 字數 4974 閱讀 8793

(1)mov

①mov ds, 2000h ; //語法錯誤,不能用立即數給段暫存器賦值。

應該為:mov ax, 2000

​ mov ds, ax

② mov word ptr[di], 2000h

ptr 是屬性運算子,功能為修改運算元的型別。word ptr 的作用是將運算元的型別 設定為字型別。

③mov [di], 04ah ; //語法錯誤:源和目的運算元的型別都不確定,產生二異性。

因為[di]代表的僅是首位址,不能確定它具體有多少個位址;而04ah也不能確定它前面有多少個0,佔的位元組數自然也不確定。

注意:① mov 指令不影響標誌暫存器的任何標誌位

② 源和目的運算元必須等長,即同時為位元組型別或字型別。

③不允許給 cs(**段暫存器) 賦值。

④ mov 指令不能訪問 ip 和 flags

(2)push,pop

push 和 pop 是堆疊操作指令助記符。堆疊是程式在記憶體中開闢的乙個資料區,用以 儲存暫存器或儲存器中暫時不用而又必須儲存的資料。

程式中堆疊是用段定義語句在記憶體中 定義的乙個堆疊段,堆疊段的段基址存放在 ss 暫存器,段內偏移位址存放在 sp 暫存器中,sp 也常稱為堆疊指標,它總是指向棧頂。

例如: 設 ss=2000h,sp=102h,ax=623eh,執行下面指令後:

push ax

ax 的資料 62h 存入 20101h 單元,3eh 存入 20100h 單元,sp=0100h

注意:堆疊指令的 運算元必須是字型別,可以是 16 位的通用暫存器或段暫存器,也可以是兩個連續的記憶體單 元,可以採用任何定址方式。

cs 不能作為 出棧指令的運算元。

堆疊指令不影響任何標誌位。

8086cpu 對所有輸入輸出埠統一管理,提供了乙個與記憶體儲器位址空間分開的、完 全獨立的位址空間,i/o 埠的位址有 8 位和 16 位兩種形式。

8086cpu 無論從埠輸出資料還是輸入資料,都要通過累加器 al 或 ax(只有這兩個暫存器),所以輸入輸 出指令又稱為累加器專用傳送指令。

in  al, 60h  ;從 60h 埠輸入乙個位元組。 

mov dx, 0378h

mov al, 『a』

out dx, al //三條**表示從並行口 0378h 輸出乙個字元『a』

(1)無符號數乘法指令 mul

功能:如果 src 為位元組型別,累加器 al 與 src 相乘,結果存在 ax 中;如果 src 為字類 型累加器 ax 與 src 相乘,結果存在 dx:ax 中。

說明:兩個乘數的資料型別要相同,指令影響標誌位 cf,of 位。 例如:

mul  ah  ;al×ah 結果儲存在 ax 中。   

mul bx ;ax×bx 結果儲存在 dx:ax 中。

mul byte ptr[si] ;al×[si]結果儲存在 ax 中。

mul word ptr[bx+di] ;ax×[bx+di]結果儲存在 dx:ax 中。

位元組相乘的乘積在 ax 中,如果標誌位 cf=of=1,表明 ah 不為 0;字相乘的乘積在 dx:ax 中,如果標誌位 cf=of=1,表明乘積的高位 dx 不為 0。

(2)有符號數乘法指令 imul

功能:指令的功能和用法與 mul 指令相同,只是運算元為帶符號數,結果也是帶符號 數。

(3)乘法的十進位製調正指令 aam

aam 指令完成 al 中數的調正。使用 aam 的前提是兩個非壓縮 bcd 碼相乘,乘積在 al 中,ah=0。

功能:把 al 暫存器的內容除以 0ah,商存在 ah 中,餘數存在 al 中。 例

mov al, 8   

mov bl, 7

mul bl

aam ;ah=5,al=6

除法指令包括無符號數除法指令 div,帶符號數除法指令 idiv。這兩條指令都隱含了被除數 ax 或 dx:ax

除數可以是暫存器或儲存器運算元,但不能是立即數。

被除數的字 長要求是除數字長的兩倍,如果除數是位元組型別,被除數必須是字型別而且要預置在 ax ,結果的商存到 al 中,餘數存到 ah 中; 如果除數為字型別,被除數必須是雙字型別而且要預置在 dx:ax 中,結果的商存到 ax 中,餘數存到 dx 中。

div  bl  

div bx

div byte ptr[si]

div word ptr[di]

如果位元組操作的結果大於 ffh 則溢位,如果字操作的結果大於 ffffh 則溢位,溢位將 產生除法錯中斷。

例子:mov bl div bl

(2)帶符號數的除法 idiv

idiv 指令與 div 指令相似,只是參加運算的是帶符號數,結果也是帶符號數,符號與 被除數一致。被除數什麼符號餘數也是什麼符號

(3)符號擴充套件指令 cbw,cwd 除法指令對運算元的長度嚴格要求,如果長度不符合要求,可以使用符號擴充套件指令對數 據型別進行調整。指令不影響標誌位。

(4)除法調正指令 aad

aad 指令進行除法調正的使用範圍有限,它只能用於兩位的非壓縮 bcd 的除法操作, 也就是不超過 99 的十進位制數的除法操作。aad 指令與其它調正指令不同,它用在除法指令 之前,即在除法執行之前首先用 aad 指令將 ax 中兩位非壓縮 bcd 碼調正為二進位制數, 然後再進行二進位制除法。

功能:ah×10+al 送入 al,ah=0。 例如:

mov  ax, 0908h ;ax=0908h,ax 存有非壓縮 bcd 數 98   

mov bl, 8

aad ;ax=09×0ah+08=92h

div bl ;ah=2,al=0ch

邏輯運算指令包括與(and)、或(or)、非(not)、異 或(xor)和測試(test)指令.

(5)測試指令 test

指令格式: test oprd1, oprd2

功能:oprd1 與 oprd2 按位進行與操作,(與and指令功能一樣)但是結果不回送 oprd1 中,所以指令執行 後兩個運算元的值保持不變。

例:test al, 01h

指令執行後 al 的值保持不變,但標誌位受到影響。如果 zf=0 說明 al 的第 0 位為 1, 如果 zf=1 說明 al 的第 0 位為 0。

串或字串是指在記憶體中連續存放的由位元組或字組成的資料串,可以是數值型或字元型 資料。我們常常要從資料串中查詢特定資料;或者比較兩個串是否相同等,或者把乙個串從 記憶體的乙個區域傳送到另乙個區域等操作;使用串操作指令就是最佳選擇。串操作指令對串 中資料進行相同的操作,可以以位元組為單位或以字為單位,可操作的最大串長度為 64k。串 操作指令包括:

movs 串傳送

cmps 串比較

scas 串掃瞄

stos 存入串

lods 取串

這五種串操作指令都是隱含指令,說明如下:

① 源運算元(源串)預設由 ds:si 指定,即源串預設在資料段,允許段超越為 cs、es 和 ss。偏移位址指標 si 自動修改。

③ 通過設定標誌暫存器中的方向標誌位df的值,可以控制串操作的方向。 df設定為0, 偏移位址指標 si 和 di 自動增量,如果串操作為位元組操作,每次偏移位址指標加 1,如果為 字操作,每次偏移位址指標加 2。df 設定為 1,偏移位址指標自動減量。如果串操作為位元組 操作,每次偏移位址指標減 1,如果為字操作,每次偏移位址指標減 2。

④ 串操作指令本身只操作一次,例如指令 movsb 的功能為將 ds:si 指明的乙個位元組 傳送到 es:di 指明的記憶體單元中。如果要使整個的源串資料全部傳送到目的串中,需要再加 乙個重複字首 rep。用於串操作指令的重複字首有三種,分別是: rep:無條件重複字首 repe:相等時重複(zf=1), repz:比較結果為 0 時重複 repne:不相等時重複(zf=0), repnz:比較結果不為 0 時重複

⑤ 帶重複操作字首的串操作指令,需要指明重複次數。用計數器 cx 指定串長度,即重 復次數,每次串操作後 cx 自動減 1,直到 cx=0,串操作結束。 綜上所述:在使用串操作指令前應預先設定源串指標 ds:si,目的串指標 es:di,計數 器 cx 和標誌位 df。

**1. 串傳送指令 movs **

功能:字串傳送。

將資料段中 string 1 中 100 個位元組傳送到附加資料段中的 string 2 中:

mov  si,  offset string1 ;初始化源串指標   

mov di, offset string2 ;初始化目的指標

mov cx, 100 ;初始化計數器

cld ;設定 df=0,使 si 和 di 按增量變化,增量為 1 |

相反功能指令是std,將方向標誌位df置1

rep movsb ;自動重複傳送,直到 cx=0

如果希望一次傳送兩個位元組,則程式改為:

mov  si,  offset string1    

mov di, offset string2

mov cx, 50

cld

rep movsw

如果 string 1 在附加資料段中,程式應為:

mov  si,  offset string1    

mov di, offset string2

mov cx, 100

cld

rep movs byte ptr es:[di], byte ptr es:[si]

資料傳送指令

資料傳送指令共有29條,資料傳送指令一般的操作是把源運算元傳送到目的運算元,指令執行完成後,源運算元不變,目的運算元等於源運算元。如果要求在進行資料傳送時,目的運算元不丟失,則不能用直接傳送指令,而採用交換型的資料傳送指令,資料傳送指令不影響標誌c,ac和ov,但可能會對奇偶標誌p有影響。以累加器a...

movs 資料傳送指令

1 指令編碼格式 mov指令是最簡單的arm指令,執行的結果就是把乙個數n送到目標暫存器rd,其中n可以是暫存器,也可以是立即數。mov指令多用於設定初始值或者在暫存器間傳送資料。指令的編碼格式如圖5.1所示。圖5.1 mov指令編碼格式 mov指令將移位碼 shifter operand 表示的資...

8086彙編 資料傳送指令

於ibm pc組合語言程式設計 沈美明 溫冬嬋 編著 負責把 資料,位址或立即數傳送到暫存器或者儲存單元中.1.通用資料傳送指令 mov,push,pop,xchg mov指令在cpu內或cpu和儲存器之間傳送位元組或字,目的運算元不允許使用立即數,也不能用cs暫存器,不允許用mov指令在兩個儲存單...