匯編程序設(shè)計_第1頁
匯編程序設(shè)計_第2頁
匯編程序設(shè)計_第3頁
匯編程序設(shè)計_第4頁
匯編程序設(shè)計_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第第4 4章章 匯編語言程序設(shè)計匯編語言程序設(shè)計4.1 偽指令偽指令4.2 匯編語言的上機過程匯編語言的上機過程4.3 系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用4.4 匯編語言程序設(shè)計匯編語言程序設(shè)計4.5 匯編語言和匯編語言和C/C+混合編程混合編程4.1 偽指令匯編源程序:匯編源程序: 按嚴格的語法規(guī)則用匯編語言編寫的程序,稱為按嚴格的語法規(guī)則用匯編語言編寫的程序,稱為匯編語言源程序,簡稱為匯編源程序或源程序。匯編語言源程序,簡稱為匯編源程序或源程序。匯編程序:匯編程序: 為計算機配置的負責把匯編源程序翻譯成目標為計算機配置的負責把匯編源程序翻譯成目標 程序的一種系統(tǒng)軟件。程序的一種系統(tǒng)軟件。匯編(過程)

2、:匯編(過程): 將匯編源程序翻譯成一一對應(yīng)的機器碼目標將匯編源程序翻譯成一一對應(yīng)的機器碼目標程序的過程稱為匯編過程或簡稱匯編。程序的過程稱為匯編過程或簡稱匯編。4.1.1 4.1.1 表達式表達式表達式:表達式: 是由常量、變量及運算符組成的有意義的式子。是由常量、變量及運算符組成的有意義的式子。常數(shù):常數(shù): 沒有任何屬性的純數(shù)值。在程序運行中不發(fā)生變化。沒有任何屬性的純數(shù)值。在程序運行中不發(fā)生變化。如:如:10010011B、0A5H、”ZHIFUCHUAN”、5.213E-4變變 量:量:表示存儲單元,單元中的數(shù)在程序運行期間隨時表示存儲單元,單元中的數(shù)在程序運行期間隨時 可以修改??梢?/p>

3、修改。變量名:變量名:存放數(shù)據(jù)單元的符號地址存放數(shù)據(jù)單元的符號地址標標 號:號:表示存儲單元,單元中存放的是機器指令代碼表示存儲單元,單元中存放的是機器指令代碼段屬性(段屬性(SEG):): 變量或標號對應(yīng)存儲單元所在段的段值變量或標號對應(yīng)存儲單元所在段的段值偏移量屬性(偏移量屬性(OFFSET):): 變量或標號對應(yīng)存儲單元的起始地址的段內(nèi)偏移變量或標號對應(yīng)存儲單元的起始地址的段內(nèi)偏移類型屬性(類型屬性(TYPE):): 變量類型主要是字節(jié)(變量類型主要是字節(jié)(BYTE)、字()、字(WORD)、)、雙字(雙字(DWORD) 標號類型主要是近(標號類型主要是近(NEAR)和遠()和遠(FAR

4、)存儲單元存儲單元算術(shù)運算符算術(shù)運算符 +、-、*、/、MOD(除法取余)、(除法取余)、SHL(左移)、(左移)、 SHR(右移)(右移)例:例: MOV AX,100*4+5 ;AX=405 邏輯運算符:邏輯運算符:AND、OR、NOT、XOR例:例: 24H OR 0FH=2FH按位運算按位運算 關(guān)系運算:關(guān)系運算: EQ、NE、LT、LE、GT、GE例:例:MOV AX,1234H GT 1024H關(guān)系運算結(jié)果總是關(guān)系運算結(jié)果總是一個數(shù)值。若關(guān)系不一個數(shù)值。若關(guān)系不成立,則結(jié)果為成立,則結(jié)果為0,若,若關(guān)系成立,則結(jié)果關(guān)系成立,則結(jié)果為為0FFFFHMOV AX,0FFFFH1 1算術(shù)

5、運算符、邏輯運算符和關(guān)系運算符算術(shù)運算符、邏輯運算符和關(guān)系運算符 (1) SEG(計算段基址)(計算段基址) 例例2:把:把VARW的偏移地址送的偏移地址送BX MOV BX,OFFSET VARW例例3:假設(shè):假設(shè)VARW變量是字變量,把變量是字變量,把VARW的類型值送的類型值送AL MOV AL, TYPE VARW ;AL =2例例1:把:把VARW所在段的段值送所在段的段值送AX MOV AX,SEG VARW變量名變量名(3)TYPE(計算符號類型值)(計算符號類型值)(2)OFFSET(計算偏移地址)(計算偏移地址)(1)定義符號名為新類型)定義符號名為新類型PTR格式:格式:

6、PTR 功能:用于指定或臨時改變變量或標號的類型功能:用于指定或臨時改變變量或標號的類型例:例:MOV WORD PTR SI,1 ;指明字類型;指明字類型(2)指定新類型)指定新類型THIS格式:格式:THIS 功能:為某個符號名建立新類型功能:為某個符號名建立新類型例:例:LABC EQU THIS BYTE MOV LABC,AL4.1.2 4.1.2 偽指令偽指令 字節(jié)定義語句字節(jié)定義語句DB格式:格式:變量名變量名 DB 功能:初值表中的每一項占一個功能:初值表中的每一項占一個字節(jié)字節(jié), 它們從變量名(符號地址)開始按它們從變量名(符號地址)開始按字節(jié)字節(jié)連續(xù)存放連續(xù)存放。例:例:C

7、OUNT DB 100 DB 0DH,0AH, VARW DB ?,?,6,?,?,?,?低低0A2406 0D64COUNTVARW高高可以使用重復操作符可以使用重復操作符DUP如:如:BUFFER DB 8 DUP(0)符號地址符號地址DUP可以嵌套如:可以嵌套如:ARRAY DB 100 DUP(0,2 DUP(1,2),),3) 字字定義語句定義語句DW格式:格式:變量名變量名 DW 功能:初值表中的每一項占一個功能:初值表中的每一項占一個字單元字單元, 它們從變量名(符號地址)開始按它們從變量名(符號地址)開始按字字連續(xù)存放。連續(xù)存放。例:例:FLAG DW 2FCDH,24H DW

8、 ?2400 2FCDFLAG低低高高匯編后對應(yīng)的存儲區(qū)域分配情況匯編后對應(yīng)的存儲區(qū)域分配情況 四字節(jié)定義語句四字節(jié)定義語句DD格式:格式:名字名字 DD 功能:初值表中的每一項占四個字節(jié)數(shù),它們功能:初值表中的每一項占四個字節(jié)數(shù),它們 從符號地址開始按四字節(jié)從小地址連續(xù)存放。從符號地址開始按四字節(jié)從小地址連續(xù)存放。格式:格式:名字名字 DQ 功能:初值表中的每一項占八個字節(jié)數(shù),它們功能:初值表中的每一項占八個字節(jié)數(shù),它們 從符號地址開始按八字節(jié)從小地址連續(xù)存放。從符號地址開始按八字節(jié)從小地址連續(xù)存放。 八字節(jié)定義語句八字節(jié)定義語句DQ 10字節(jié)定義指令字節(jié)定義指令DT 2 2符號常量定義偽指

9、令符號常量定義偽指令EQUEQU、 格式:格式: EQU 功能:將表達式的值賦給符號常量功能:將表達式的值賦給符號常量 等價語句等價語句EQU表達式可以是常表達式可以是常數(shù)、數(shù)值表達式、數(shù)、數(shù)值表達式、字符串、存儲器字符串、存儲器符號等符號等例:例:COUNT EQU 100 ;符號;符號COUNT代表常數(shù)代表常數(shù)100 BUFF EQU 4*COUNT ;BUFF代表代表400 HELLO EQU “How are you! ” ;HELLO代表代表How are you VARW EQU THIS WORD ;變量;變量VARW的類型是字的類型是字 注意:等價語句的符號常量名不能被重新賦值

10、注意:等價語句的符號常量名不能被重新賦值 等號語句等號語句=格式:格式: = 功能:將表達式的數(shù)值賦給符號常量功能:將表達式的數(shù)值賦給符號常量數(shù)值表達式數(shù)值表達式例:例:ABCD = 100 YY = 20+300/4 ABCD = 2*ABCD+1可以重新賦值可以重新賦值3. 3. 段定義偽指令段定義偽指令segmentsegment和和endsends段定義的一般格式:段定義的一般格式: SEGMENT 定位方式定位方式連接方式連接方式類型名類型名 ENDS段開始語句段開始語句段結(jié)束語句段結(jié)束語句例:一個簡單的數(shù)據(jù)段例:一個簡單的數(shù)據(jù)段 DSEG SEGMENT BUFFER DB 8 D

11、UP(0) DSEG ENDS開始的段名與結(jié)開始的段名與結(jié)束的段名必須相束的段名必須相同,段的長度不同,段的長度不能超過能超過64KB,SEGMENT后面后面的參數(shù)是可選的的參數(shù)是可選的注意: 定位方式(定位類型)定位方式(定位類型)定位類型指出了對當前段起始地址的要求,有定位類型指出了對當前段起始地址的要求,有4個選項個選項PAGE 指定起始地址的低指定起始地址的低8位是位是0,即其值能被,即其值能被256整除(稱頁邊界)整除(稱頁邊界)PARA 指定起始地址的低指定起始地址的低4為是為是0,即其值能被,即其值能被16整除(整除(稱段邊界稱段邊界)WORD指定起始地址的最低位是指定起始地址的

12、最低位是0,即其值能被,即其值能被2整除(稱為字邊界)整除(稱為字邊界)BYTE 指定起始地址是任意值指定起始地址是任意值缺省定位缺省定位定位類型是用來確定程序段與程序段之間的銜接,如定位類型是用來確定程序段與程序段之間的銜接,如BYTE 使得當前段緊接前一段,而使得當前段緊接前一段,而PAGE可能導致最大的段間隔可能導致最大的段間隔 連接方式(組合類型)連接方式(組合類型)連接方式告訴連接程序本段可按某種方式連接連接方式告訴連接程序本段可按某種方式連接PUBLIC告訴連接程序本段與其它同名同類別告訴連接程序本段與其它同名同類別 的段連接起來,公用一個起始點。的段連接起來,公用一個起始點。ST

13、ACK 表示是堆棧段,連接方式同上。表示是堆棧段,連接方式同上。NONE 表示本段不與任何段連接。表示本段不與任何段連接。COMMON表示本段與同名同類別的段共用同一段地址,表示本段與同名同類別的段共用同一段地址, 即同名同類段相重疊。即同名同類段相重疊。MEMORY本段連接時定位在所有段之上,即高地址處。本段連接時定位在所有段之上,即高地址處。AT 表達式表達式表示本段定位在表達式值指定的段地址處。表示本段定位在表達式值指定的段地址處。隱含連接方式隱含連接方式一個源程序至少有一個堆棧段一個源程序至少有一個堆棧段 類別名類別名 類別名是由程序員指定的字符串,沒有給出類別時,類別名是由程序員指定

14、的字符串,沒有給出類別時,這個段的類別就為空。這個段的類別就為空。例:某個源程序例:某個源程序SSEG SEGMENT PARA STACK DB 1024 DUP(?)(?)SSEG ENDS;DSEG SEGMENT PARA COMMONMESS DB HELLO,0DH,0AH,DSEG ENDS;CSEG SEGMENT PARA PUBLICCSEG ENDS END START4. 設(shè)定段寄存器偽指令A(yù)SSUME格式:格式:ASSUME 段寄存器:段定義名段寄存器:段定義名1,段寄存器:段定義名,段寄存器:段定義名2,功能:告訴匯編程序在匯編時,段寄存器的符號基址功能:告訴匯編程

15、序在匯編時,段寄存器的符號基址例:例:DSEG1 SEGMENT VARW DW 12 DSEG1 ENDS ; DSEG2 SEGMENT XXX DW 0 YYY DW 0 DSEG2 ENDS ;CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG1,ES:DSEG2 MOV AX,DSEG1 MOV DS,AX MOV AX,DSEG2 MOV ES,AX CSEG ENDS 5. ORG5. ORG偽指令偽指令格式:格式:ORG 功能:把以下語句定義的內(nèi)存數(shù)據(jù)或程序,從表達式功能:把以下語句定義的內(nèi)存數(shù)據(jù)或程序,從表達式 指定的起點開始連續(xù)存放。指定的起點開始連續(xù)存

16、放。格式:格式:END 表達式表達式功能:告訴匯編程序源文件結(jié)束,并給出執(zhí)行程功能:告訴匯編程序源文件結(jié)束,并給出執(zhí)行程 序的入口地址序的入口地址程序的啟動地址程序的啟動地址格式:格式: PROC 過程類型過程類型 RET ENDP段間為段間為FAR段內(nèi)為段內(nèi)為NEAR4.1.3 匯編語言程序的基本框架完整段定義的框架如下:完整段定義的框架如下:STACK SEGMENT STACK ;定義堆棧段定義堆棧段STACK ENDSDATASEGMENT;定義數(shù)據(jù)段定義數(shù)據(jù)段DATAENDSCODE SEGMENT;定義代碼段定義代碼段 ASSUME CS:CODE,DS:DATA,SS:STACK

17、START: MOV AX,DATA MOV DS,AX;數(shù)據(jù)段段地址送數(shù)據(jù)段段地址送DS中中MOV AH,4CH ;程序結(jié)束返回程序結(jié)束返回DOSINT 21HCODE ENDS;代碼段結(jié)束代碼段結(jié)束END START4.2 匯編語言的上機過程編輯程序編輯程序源程序文件源程序文件.asm宏匯編程序宏匯編程序MASM語法錯誤?語法錯誤?連接程序連接程序LINK可執(zhí)行文件可執(zhí)行文件.exe/map調(diào)試程序調(diào)試程序DEBUG有錯嗎?有錯嗎?目標程序文件目標程序文件.obj/lis無無無無有有有有匯編語言程序的開發(fā)過程匯編語言程序的開發(fā)過程4.3 系統(tǒng)功能調(diào)用調(diào)用方法:調(diào)用方法: 準備入口參數(shù)準備入

18、口參數(shù) 功能調(diào)用號送功能調(diào)用號送AH寄存器寄存器 軟中斷指令軟中斷指令 INT 21H 功能:從鍵盤讀一字符,并將該字符回顯在顯示器上功能:從鍵盤讀一字符,并將該字符回顯在顯示器上入口參數(shù):無入口參數(shù):無出口參數(shù):出口參數(shù):AL=讀到字符的讀到字符的ASCII碼碼說明:如果讀到的字符是說明:如果讀到的字符是Ctrl+c或或Ctrl+Break則結(jié)束程序則結(jié)束程序例:例: MOV AH,1 INT 21H 2. 從鍵盤接收一串字符(0AH號功能)功功 能:從鍵盤讀一字符串。能:從鍵盤讀一字符串。入口參數(shù):入口參數(shù):DS:DX=緩沖區(qū)首址,緩沖區(qū)的第緩沖區(qū)首址,緩沖區(qū)的第一個字節(jié)放緩沖區(qū)最大容量數(shù)

19、一個字節(jié)放緩沖區(qū)最大容量數(shù)出口參數(shù):接收到的字符串在緩沖出口參數(shù):接收到的字符串在緩沖 區(qū)中第三個字節(jié)開始區(qū)中第三個字節(jié)開始說說 明:明: 緩沖區(qū)第二個字節(jié)存放實際讀入緩沖區(qū)第二個字節(jié)存放實際讀入 的字符數(shù)。的字符數(shù)。 字符串以回車結(jié)束字符串以回車結(jié)束 如果輸入字符串超過了緩沖的區(qū)容如果輸入字符串超過了緩沖的區(qū)容 量,量, 超出的部分丟失,同時響鈴超出的部分丟失,同時響鈴 如果在輸入時按如果在輸入時按Ctrl+C或或Ctrl+Break, 則結(jié)束程序則結(jié)束程序 例:例: BUF DB 20 DB ? DB 20 DUP(?)(?) MOV DX,OFFSET BUF MOV AH,0AH IN

20、T 21H 3. 顯示一個字符(02H號功能)功能:寄存器功能:寄存器DL中的字符從屏幕上顯示輸出中的字符從屏幕上顯示輸出入口參數(shù):入口參數(shù):DL=要輸出字符的要輸出字符的ASCII碼碼出口參數(shù):無出口參數(shù):無例:例: MOV DL,A MOV AH,2 INT 21H 4. 顯示一串字符(09H號功能)功功 能:將指定緩沖區(qū)中的字符串從屏幕上顯示輸出能:將指定緩沖區(qū)中的字符串從屏幕上顯示輸出入口參數(shù):入口參數(shù):DS:DX=要輸出字符的首址,字符串以字符要輸出字符的首址,字符串以字符 為結(jié)束標志為結(jié)束標志出口參數(shù):無出口參數(shù):無 BUF DB good bye MOV DX,OFFSET BU

21、F MOV AH,09H INT 21H 例:例:5. 5. 返回操作系統(tǒng)(返回操作系統(tǒng)(4CH4CH號功能)號功能)功功 能:結(jié)束當前正在執(zhí)行的程序,并返回操作系統(tǒng)能:結(jié)束當前正在執(zhí)行的程序,并返回操作系統(tǒng)入口參數(shù):無入口參數(shù):無出口參數(shù):無出口參數(shù):無回到回到DOS提示符下提示符下C:例:例: MOV AH,4CH INT 21H 4.4 4.4 匯編語言程序設(shè)計匯編語言程序設(shè)計8086系列匯編語言源程序是建立在段結(jié)構(gòu)基礎(chǔ)上的系列匯編語言源程序是建立在段結(jié)構(gòu)基礎(chǔ)上的(1)使用段定義偽指令來構(gòu)成一個由若干指令)使用段定義偽指令來構(gòu)成一個由若干指令 和數(shù)據(jù)組成的程序。和數(shù)據(jù)組成的程序。(2)一

22、個程序究有幾個段,完全根據(jù)實際情況)一個程序究有幾個段,完全根據(jù)實際情況 來確定,通常是按照程序中的用途來劃分來確定,通常是按照程序中的用途來劃分 段的,如存放數(shù)據(jù)的段,作為堆棧的段,段的,如存放數(shù)據(jù)的段,作為堆棧的段, 存放程序的段,存放子程序的段等存放程序的段,存放子程序的段等4.4.1 4.4.1 順序程序設(shè)計順序程序設(shè)計沒有分支、沒有分支、沒有循環(huán)沒有循環(huán)的直線運行程,的直線運行程,即順序結(jié)構(gòu)。即順序結(jié)構(gòu)。 DATASEGMENT ADW 1234HBDW 5678HCDW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX

23、,DATAMOV DS,AXMOV AX,AADD AX,BMOV C,AXMOV AH,4CHINT 21HCODE ENDSEND START最簡單的程序最簡單的程序4.4.2 分支程序設(shè)計條件滿足?條件滿足?語句系列語句系列YN條件滿足?條件滿足?語句系列語句系列1語句系列語句系列2YN兩種分支結(jié)構(gòu)示意圖兩種分支結(jié)構(gòu)示意圖例:編一個程序。從外設(shè)例:編一個程序。從外設(shè)71H取一個數(shù)取一個數(shù)M,判斷其值是否在,判斷其值是否在10和和 20之間,即之間,即10M20。如果。如果M20,則送,則送0FFH給外設(shè)給外設(shè)73H; 如果如果M10,則送,則送00H給外設(shè)給外設(shè)73H;如果;如果10M2

24、0, 則送則送88H給外設(shè)給外設(shè)73H。 分析分析根據(jù)題意需要兩次判斷根據(jù)題意需要兩次判斷M的大小,根據(jù)判的大小,根據(jù)判斷結(jié)果把斷結(jié)果把00H或或0FFH或或88H輸出到輸出到73H端口。端口。 畫流程圖畫流程圖開始開始輸入輸入71H外外設(shè)值設(shè)值A(chǔ)LAL10?AL20?BL=88HBL=0FFHBL=00H輸出輸出BL到到外設(shè)外設(shè)73H暫停暫停LP1LP2LP3YYIN AL,71H;71H端口數(shù)端口數(shù)ALCLCCMP AL,10JB LP1 ;小于;小于10轉(zhuǎn)轉(zhuǎn)LP1CMP AL,20JAE LP2 ;大于或等于;大于或等于20轉(zhuǎn)轉(zhuǎn)LP2MOV BL,88HJMP LP3MOV BL,00H

25、JMP LP3MOV BL,0FFHMOV AL,BLOUT 73H,AL ;將;將BL的內(nèi)容輸?shù)膬?nèi)容輸HLT 出到端口出到端口73HLP3:LP1:LP2:4.4.3 4.4.3 循環(huán)程序設(shè)計循環(huán)程序設(shè)計開始判斷循環(huán)體結(jié)束處理結(jié)束初始化循環(huán)控制循環(huán)控制條件循環(huán)控制條件循環(huán)體循環(huán)體YDO WHILE結(jié)構(gòu)結(jié)構(gòu)循環(huán)初始狀態(tài)循環(huán)初始狀態(tài)N循環(huán)控制條件循環(huán)控制條件循環(huán)體循環(huán)體YDO UNTIL 結(jié)構(gòu)結(jié)構(gòu)循環(huán)初始狀態(tài)循環(huán)初始狀態(tài)例:例:求兩個多字節(jié)數(shù)之求兩個多字節(jié)數(shù)之和。這兩個數(shù)和。這兩個數(shù)在在10050H開開始的單元中,始的單元中,連續(xù)存放,連續(xù)存放,低位在小地低位在小地址一端,結(jié)果址一端,結(jié)果放在兩

26、個數(shù)放在兩個數(shù)之后。設(shè)這之后。設(shè)這兩個多字節(jié)兩個多字節(jié)數(shù)均為八個數(shù)均為八個字節(jié)長。字節(jié)長。MOV AX,1000HMOV DS,AXMOV S1,50H MOV DI,58H MOV BX,60HMOV CX,4CLCMOV AX,SIADC AX,DIMOV BX,AXPUSHFADD SI,2ADD DI,2ADD BX,2POPFLOOP AAHLTAA:開始開始CX=0?取一個字取一個字AX修改指針,修改指針,SISI+2DIDI+2,CXCX-1暫停暫停初始化初始化求和求和AX=AX+DI+CFN4.4.4 4.4.4 子程序設(shè)計子程序設(shè)計子程序:也叫過程,相對主程序而言,是一個子的

27、程序段,子程序:也叫過程,相對主程序而言,是一個子的程序段, 它能被主程序調(diào)用,也能被其它子程序調(diào)用它能被主程序調(diào)用,也能被其它子程序調(diào)用一般把有公用性、重復性或有相對獨立性一般把有公用性、重復性或有相對獨立性的程序設(shè)計成子程序的程序設(shè)計成子程序 參數(shù)傳遞參數(shù)傳遞必須設(shè)計好子程序中用到了哪些寄存器或必須設(shè)計好子程序中用到了哪些寄存器或 存儲單元。哪些是需要調(diào)用程序提供的,存儲單元。哪些是需要調(diào)用程序提供的, 哪些是結(jié)果提供給調(diào)用程序的。哪些是結(jié)果提供給調(diào)用程序的。子程序設(shè)計與應(yīng)用應(yīng)注意的問題子程序設(shè)計與應(yīng)用應(yīng)注意的問題寄存器傳遞參數(shù)寄存器傳遞參數(shù) 存儲單元傳遞參數(shù)存儲單元傳遞參數(shù) 堆棧傳遞參數(shù)

28、堆棧傳遞參數(shù) 參數(shù)傳遞參數(shù)傳遞 子程序說明子程序說明一個子程序,可以被其它程序調(diào)用,必須一個子程序,可以被其它程序調(diào)用,必須 提供一些說明。如:提供一些說明。如:程序名、程序的功能、占用的寄存器或程序名、程序的功能、占用的寄存器或存儲單元、入口及出口參數(shù)、嵌套了哪存儲單元、入口及出口參數(shù)、嵌套了哪些子程序。些子程序。 兩個兩個6字節(jié)數(shù)相加。將一個字節(jié)相加的程序段設(shè)計為子字節(jié)數(shù)相加。將一個字節(jié)相加的程序段設(shè)計為子程序。主程序分程序。主程序分6次調(diào)用該子程序,但每次調(diào)用的參數(shù)不同。次調(diào)用該子程序,但每次調(diào)用的參數(shù)不同。 例:例:DATASEGMENT ADD1DB FEH,86H,7CH,35H,

29、68H,77H ADD2DB 45H,BCH,7DH,6AH,87H,90H SUM DB 6 DUP(0) COUNTDB 6DATAENDSCODE SEGMENTASSUMECS:CODE,DS:DATAMADD: MOV AX,DATA MOV DS,AX MOV SI,OFFSET ADD1 MOV DI,OFFSET ADD2 MOV BX,OFFSET SUM MOV CX,COUNT ;循環(huán)初值為循環(huán)初值為6 CLCAGAIN: CALL SUBADD ;調(diào)用子程序調(diào)用子程序 LOOP AGAIN ;循環(huán)調(diào)用循環(huán)調(diào)用6次次 MOV AH,4CH INT 21H;子程序入口參數(shù)子

30、程序入口參數(shù):SI,DI,BX 出口參數(shù)出口參數(shù):SI,DI,BXSUBADD PROC ;完成一個字節(jié)相加完成一個字節(jié)相加 PUSH AX ;保護保護AX的值的值 MOV AL,SI ;SI是一個源操作數(shù)指針是一個源操作數(shù)指針 ADC AL,DI ;DI是另一個源操作數(shù)指針是另一個源操作數(shù)指針 MOV BX,AL ;BX是結(jié)果操作數(shù)指針是結(jié)果操作數(shù)指針 INC SI INC DI INC BX POP AX;恢復恢復AX的值的值 RETSUBADD ENDPCODE ENDS END MADD4.5 匯編語言和C/C語言混合編程混合語言編程:采用兩種或兩種以上的編程語混合語言編程:采用兩種或

31、兩種以上的編程語言組合編程,彼此相互調(diào)用,進行參數(shù)傳遞,言組合編程,彼此相互調(diào)用,進行參數(shù)傳遞,共享數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)信息,是一種有效的程序共享數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)信息,是一種有效的程序設(shè)計方法。設(shè)計方法。 匯編語言和匯編語言和C/C語言混合編程的方法有兩種:語言混合編程的方法有兩種:(1)在)在C/C源程序中直接插入?yún)R編源代碼,這源程序中直接插入?yún)R編源代碼,這種方法稱為嵌入式匯編。種方法稱為嵌入式匯編。(2)在)在C/C源程序中調(diào)用外部的匯編語言過程源程序中調(diào)用外部的匯編語言過程 4.5.1 嵌入式匯編 在需要的地方寫上匯編指令,并在嵌入的在需要的地方寫上匯編指令,并在嵌入的匯編指令前加上關(guān)鍵字匯編指

32、令前加上關(guān)鍵字asm或或_ _asm即可。即可。格式格式1:asm 格式格式2:_ _asm 格式格式3:_ _asm匯編指令匯編指令 注:格式注:格式1適用于在適用于在C程序中嵌入?yún)R編指令,程序中嵌入?yún)R編指令, 格式格式2和格式和格式3則適用于在則適用于在Visual C+程序中嵌程序中嵌 入?yún)R編指令。入?yún)R編指令。#includevoid main( ) int array10; int i ; for(i=0;i=8;i+) arrayi=i ; _asm mov array9*type int,90 /*數(shù)值數(shù)值90傳送給數(shù)組元素傳送給數(shù)組元素 array9*/ for(i=0;i=9;

33、i+) printf(%5d,arrayi); printf(n);嵌入式匯編舉例運行結(jié)果:運行結(jié)果:0 1 2 3 4 5 6 7 8 904.5.2 C/C+程序調(diào)用匯編程序(1)1匯編程序的編寫匯編程序的編寫(1)匯編過程的進入)匯編過程的進入 匯編過程的進入一般以兩條指令開始,即:匯編過程的進入一般以兩條指令開始,即: push bp mov bp sp(2)局部數(shù)據(jù)分配(可選擇)局部數(shù)據(jù)分配(可選擇)加上一條指令加上一條指令sub sp, space其中其中space是以是以字節(jié)字節(jié)計算的局部數(shù)據(jù)區(qū)的總大小計算的局部數(shù)據(jù)區(qū)的總大小 (3)用堆棧傳遞參數(shù)及對參數(shù)的訪問)用堆棧傳遞參數(shù)及對參數(shù)的訪問通過參數(shù)與通過參數(shù)與bp的位移量來確定的位移量來確定設(shè)參數(shù)為設(shè)參數(shù)為x,它與,它與bp的位移量可以這樣來計算:的位移量可以這樣來計算:2返回地址字節(jié)數(shù)參數(shù)返回地址字節(jié)數(shù)參數(shù)x與與bp間的參數(shù)所占的總字節(jié)數(shù)間的參數(shù)所占的總字節(jié)數(shù)(4)結(jié)果和值的返回)結(jié)果和值的返回返回值的數(shù)據(jù)類型是返回值的數(shù)據(jù)類型是簡單型簡單型,而且長度,而且長度不超過不超過4字節(jié)字節(jié)返回值返回值超過超過4個字節(jié)個字節(jié) NEAR AX FAR DX:AX (DX裝段地址,裝段地址,AX裝偏移地址)。裝偏移地址)。數(shù)據(jù)大小返回值數(shù)據(jù)大小返回值所放寄存器所放寄存器1字節(jié)字節(jié)AL2字節(jié)字節(jié)AX4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論