匯編語言mov指令及基本用法
在匯編語言中,MOV指令是數(shù)據(jù)傳送指令,也是最基本的編程指令,用于將一個數(shù)據(jù)從源地址傳送到目標(biāo)地址(寄存器間的數(shù)據(jù)傳送本質(zhì)上也是一樣的)。其特點是不破壞源地址單元的內(nèi)容。
例如:
MOV AX,2000H;將16位數(shù)據(jù)2000H傳送到AX寄存器
MOV AL,20H;將8位數(shù)據(jù)20H傳送到AL寄存器
MOV AX,BX;將BX寄存器的16位數(shù)據(jù)傳送到AX寄存器
MOV AL,[2000H];將2000H單元的內(nèi)容傳送到AL寄存器
需要注意的是:
(1)兩個存儲單元之間不能直接傳送數(shù)據(jù),即:MOV指令只允許一個操作數(shù)在存儲器中。MOV [SI],[2000H];這是錯誤的
(2)MOV指令中立即數(shù)不能直接傳送給段寄存器(CS、DS、SS、ES)和IP;段寄存器之間不能直接傳送。MOV IP,2000 H ;這是錯誤的
(3)CS和IP不能作為目的操作數(shù)。MOV CS,AX ;這是錯誤的
(4)MOV指令中立即數(shù)不能作目標(biāo)操作數(shù)。MOV 2000H,[SI] ;這是錯誤的
MOV指令可以在CPU內(nèi)或CPU和存儲器之間傳送字或字節(jié),它傳送的信息可以從寄存器到寄存器,立即數(shù)到寄存器,立即數(shù)到存儲單元,從存儲單元到寄存器,從寄存器到存儲單元,從寄存器或存儲單元到除CS外的段寄存器(注意立即數(shù)不能直接送段寄存器),從段寄存器到寄存器或存儲單元。
但是注意
*(1) MOV指令中的源操作數(shù)絕對不能是立即數(shù)和代碼段CS寄存器;
(2) MOV指令中絕對不允許在兩個存儲單元之間直接傳送數(shù)據(jù);
(3) MOV指令中絕對不允許在兩個段寄存器之間直接傳送數(shù)據(jù);
(4) MOV指令不會影響標(biāo)志位*
例:MOV AX,DATA_SEG
MOV DS,AX
注意:段寄存器(段地址)必須通過寄存器如AX寄存器進行立即數(shù)的初始化。
例: MOV AL,‘E'
把立即數(shù)(字符E的ASC碼)送到AL寄存器。
例: MOV BX,OFFSET TABLE
將TABLE的偏移地址(而不是內(nèi)容)送到BX寄存器中。其中OFFSET為屬性操作符,表示的是將其后的符號地址的值(不是內(nèi)容)作為操作數(shù)。
例 MOV AX,Y[BP][SI]
把地址為16d×(SS)十(BP)十(SI)十位移量Y的存儲單元的內(nèi)容送給AX寄存器
PS:下面看下匯編中的mov指令的基本使用
mov S ,D 是將D傳送到S ,還是S傳送到D中去呢?
在王爽的《匯編》中說: mov ax , 18 是將 18傳送到寄存器ax中。
但是我用gcc反匯編如下函數(shù)
int test() { return 2; }
得到的匯編代碼卻是
_add: LFB7: .cfi_startproc movl $2, %eax ;//將eax內(nèi)容復(fù)制到2中???顯然不對啊 ret .cfi_endproc
總結(jié)
以上所述是小編給大家介紹的匯編語言mov指令及基本用法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
匯編程序設(shè)計之DOSBox模擬環(huán)境配置
最近在學(xué)習(xí)匯編語言設(shè)計,然后上網(wǎng)找關(guān)于匯編程序的編譯軟件,不負有心人,終于找到了我需要的軟件,值得慶幸2023-08-08匯編語言系列之匯編實現(xiàn)各種碼制的轉(zhuǎn)換(思路詳解)
本文列出了十六進制轉(zhuǎn)二進制、十進制、ASCII碼及大小寫字母轉(zhuǎn)換的代碼,對匯編語言系列之實現(xiàn)各種碼制的轉(zhuǎn)換問題感興趣的朋友跟隨小編一起看看吧2021-11-11