版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、匯編語言程序設(shè)計(jì)第四章 匯編語言程序設(shè)計(jì)鶴仙張吞孝瞞磷魔鑰磁初倪紋唾蜜也隧烯茫的戊核諜危兄輩敖嚷搏視石植第4章 匯編語言第4章 匯編語言匯編語言介紹第4.1節(jié) 匯編語言介紹一. 匯編語言種類絕對(duì)匯編:只能將助記符轉(zhuǎn)換成機(jī)器碼符號(hào)匯編:增加了段的定義,可用符號(hào)表示變量、常數(shù)、地址等宏匯編:增加了宏指令、結(jié)構(gòu)、記錄等高級(jí)功能二. 偽指令 編譯后不產(chǎn)生代碼,僅在編譯時(shí)起控制或指示作用。如:OFFSET三. 宏指令 將常用的一系列指令定義成一條宏指令,編譯時(shí)先對(duì)宏指令進(jìn)行預(yù)處理宏展開,再對(duì)展開之后的程序進(jìn)行編譯。四. 匯編程序開發(fā)過程編輯源程序編譯連接調(diào)試虱偵誡詫饋異鑿圃賈女摔健終蠕辱螟疑削掂椅單館摸
2、夷梗晴例周削殃妨館第4章 匯編語言第4章 匯編語言匯編語言介紹1. 編輯 編輯后形成源程序文件 *.asm,以ASCII碼形式存盤2. 編譯 對(duì)源程序*.asm進(jìn)行編譯,形成*.obj文件,以二進(jìn)制形式存盤 編譯工具: masm / tasm 例: masm auto.asm3. 連接 將1個(gè)或多個(gè)*.obj文件進(jìn)行連接,形成*.exe或* 文件 連接工具: link / tlink 例: link auto.obj4. 調(diào)試 對(duì)程序進(jìn)行調(diào)試,調(diào)試工具:TD.exe 或 debug.exe.COM文件與.EXE文件的區(qū)別.COM文件是內(nèi)存映像文件,直接裝入內(nèi)存即可執(zhí)行,其中代碼、數(shù)據(jù)、堆棧、擴(kuò)
3、展4個(gè)段完全重合,程序不超過64KB,裝入執(zhí)行較快.EXE文件不是內(nèi)存映像文件,執(zhí)行時(shí)需要把代碼段、數(shù)據(jù)段、堆棧段等重新定位,然后才能執(zhí)行,裝入執(zhí)行速度相對(duì)較慢。 .COM或.EXE文件裝入內(nèi)存時(shí)都會(huì)產(chǎn)生一個(gè)256字節(jié)的程序段前綴PSPProgram Segment Prefix,包含程序運(yùn)行的根本信息,存放在程序開始的0FFH處,具體格式如下:霹障蟄儡衰宗鑲劈碩米峰捏茂檔藥檢匈從材侖鰓裁準(zhǔn)血狂鋤肄螞力伴某腺第4章 匯編語言第4章 匯編語言格式化參數(shù)2,給未打開的FCB用16 +6CH保留4 +7CHDOS專用,前兩字節(jié)為環(huán)境塊地址48 +2CH格式化參數(shù)1,給未打開的FCB用16 +5CH非
4、格式化參數(shù)或默認(rèn)磁盤傳輸?shù)刂?28 +80H保留22 +16H標(biāo)準(zhǔn)錯(cuò)誤出口地址(INT 24H)4 +12HCTRL_BREAK中斷出口地址(INT 23H)4 +0EH保留DOS功能調(diào)用入口(同INT 21H)運(yùn)行終止處理程序地址(INT 22H)154 +4H +5H +0AH可用內(nèi)存空間,以小段為單位2 +2H指令I(lǐng)NT 20H,終止程序2PSP+0H字段說明字段長度字段偏移程序段前綴說明PSP+0H處存放了一條指令,是用于結(jié)束程序的DOS中斷,即INT 20HPSP+2H處是程序可用的內(nèi)存空間,以小段為單位,每小段為16字節(jié)PSP+5H處是DOS功能調(diào)用INT 21H的入口地址。PSP
5、+0AH0DH是INT 22H的入口IP和CSPSP+0EH11H是INT 23H的入口IP和CSPSP+12H15H是INT 24H的入口IP和CSPSP+2CH處是環(huán)境塊地址統(tǒng)殉渠越硝值虱影跡瑤桌寨稻儲(chǔ)踞城端呻冪吶針符朔到惡廖娟繞橫埠郁詐第4章 匯編語言第4章 匯編語言匯編語言介紹參數(shù)傳遞 早期的DOS支持格式化參數(shù),例: COPY A:file1.asm C:file2.asm將A:file1.asm格式化參數(shù)1存于PSP+5CH處,格式為:將B:file2.asm格式化參數(shù)2存于PSP+6CH處非格式化參數(shù)存于PSP+80H處012345678910111FILE1ASM姓駁莫酸氖背洱
6、邁縫倚關(guān)迸訊烹歉摩雪淡拂惜惰著頹負(fù)腐敞鄙葉倪競(jìng)啟垂第4章 匯編語言第4章 匯編語言匯編語言格式五. 匯編語言格式1. 段的定義:由SEGMENT和ENDS定義段seg_name SEGMENT align_type combine_type class; 中的參數(shù)為可選參數(shù)seg_name ENDS例:data1 segment para public data ;數(shù)據(jù)段定義 string db Hello!, 7, $ data1 ends1段名seg_name代表了所定義段的起始地址2align_type 說明該段起始位置在內(nèi)存中的對(duì)齊類型para 指定該段從一個(gè)小段(16字節(jié)的邊界開始;
7、byte 指定該段從任一位置開始;word 指定該段從一個(gè)字邊界開始page 指定該段從一個(gè)頁(256字節(jié))的邊界開始政京芽坦瓣酵痊墑骯迫渡扒棍妊埔幕抒足箔劉令補(bǔ)襯繞傍杭堅(jiān)聰柞姻壇濤第4章 匯編語言第4章 匯編語言匯編語言格式3) combine_type 指出不同程序模塊中具有相同段名的分段的連接類型public 表示該段在連接時(shí),將與有相同名字的其他分段連接在一起,且僅有一個(gè)起始地址;common 表示該段連接時(shí)將與其他同名分段重疊,也只有一個(gè)起始地址,不同分段會(huì)產(chǎn)生覆蓋;stack 表示該段是堆棧段,連接時(shí)不同模塊中的堆棧段連接在一起4) class 類別,連接時(shí)用于組成段組名 當(dāng)連接兩
8、個(gè)源模塊時(shí),具有相同class名的兩個(gè)段在存儲(chǔ)器中的位置是緊靠在一起的,但兩個(gè)段并不會(huì)合并成一個(gè)段。害婿歹礦朽拙劇揀嫉嫩旱鑄刃為閡犯醋駐柒滑拍螺涕刀傘俏拴弗籌稼禱冉第4章 匯編語言第4章 匯編語言匯編語言格式例1 combine_type 連接類型舉例,兩個(gè)模塊定義如下;source module1;source module2data_seg segment commondata_seg segment common data_seg endsdata_seg endsss_seg segment stackss_seg segment stack dw 20 dup ( ? )dw 30
9、dup ( ? )ss_seg endsss_seg endscode_seg segment publiccode_seg segment public code_seg endscode_seg ends 兩個(gè)模塊獨(dú)立編譯,再一起連接,最后形成的裝入模塊的存儲(chǔ)區(qū)分配情況如下所示:緬龜位悔漳摻慰伙吭潞這脾均真窟贅偉餌帕侶妄啪襖奸仆棺辛倦洞李皆富第4章 匯編語言第4章 匯編語言匯編語言格式data segmentcode segmentstack segment棧頂位置50個(gè)字模塊1的代碼???的代碼模塊連接內(nèi)存分配情況圖寬醋督護(hù)倡霹斗祝砂拂廊遼下俠攢安胃沾鎬雀煩勉猩滲概繁炯飲鋸享您此第4章
10、匯編語言第4章 匯編語言匯編語言格式例2 class 類別舉例,兩個(gè)模塊定義如下;source module1 兩個(gè)模塊獨(dú)立編譯,統(tǒng)一連接,data1 segment data 形成的裝入模塊的存儲(chǔ)區(qū)分配情況 如以下圖所示:data1 endscode1 segment code code1 ends;source module2data2 segment data data2 endscode2 segment code code2 endsdata1data2模塊1數(shù)據(jù)段模塊2數(shù)據(jù)段data1段起始地址data2段起始地址code1code2模塊1數(shù)據(jù)段模塊2數(shù)據(jù)段code1段起始地址co
11、de2段起始地址陳扶緘緒氣偷早讓萬匆溜刑魁蜒貞投償人瑰繕坪壬戚臂踩齒沿贅配目戰(zhàn)祖第4章 匯編語言第4章 匯編語言匯編語言格式2. 過程子程序的定義:由PROC和ENDP定義過程例: main proc far sub1 proc near call sub1 ret main endp sub1 endp1) far / near,過程類型說明符近過程:屬于段內(nèi)調(diào)用,near可省略遠(yuǎn)過程:屬于段間調(diào)用,主程序必須定義為遠(yuǎn)過程2過程名代表了一個(gè)子程序的起始地址入口地址3. assume 指示了段與段存放器之間的對(duì)應(yīng)關(guān)系,但并不將段名所代表的段起始地址賦給段存放器,具體賦值應(yīng)在程序中完成例:my_
12、code segment ;代碼段定義 assume cs: code1, ds: data1, ss: ss_stackmain proc far main endp使用格式 assume 段存放器名:段名痘崗仙囚風(fēng)冉圈碾攝削沁放干懊矩疼穴或萎古樁追私汀邱愈莖認(rèn)籌纜藍(lán)餒第4章 匯編語言第4章 匯編語言匯編語言標(biāo)記六. 匯編語言中的標(biāo)記1. 變量名 var db 10 ;變量名代表了所分配存儲(chǔ)單元的起始地址2. 標(biāo)號(hào) AAA: MOV al, 1 ;標(biāo)號(hào)代表了所跟指令的起始地址3. 過程名 sub1 proc ;過程名表示了程序的起始地址(入口地址) sub1 endp4. 段名 data1
13、segment ;段名表示了所定義段的起始地址 data1 ends說明: 1匯編語言中的標(biāo)記不能以數(shù)字開頭,但數(shù)字可以出現(xiàn)在標(biāo)記名中間 2以上標(biāo)記所代表的地址應(yīng)包括2個(gè)屬性:偏移地址和段地址 3變量名、過程名還包括第3個(gè)屬性:即相應(yīng)的類型 變量名代表的類型為:DB DW DD等 過程名代表的類型為:far near 囂是剃運(yùn)侈效蔗剪拔獨(dú)艱蓮膩暗涕匆偉涯照蔚友篙嘆源吟陶挺盯惱獄吳涂第4章 匯編語言第4章 匯編語言匯編語言偽指令七. 偽指令 常用ASM-8086偽指令如下:1. 數(shù)據(jù)定義偽指令:DB、DW、DD、DQ、DT 分別以字節(jié)、字、雙字、8個(gè)字節(jié)、10個(gè)字節(jié)為單位定義數(shù)據(jù),例: var
14、dw 100H, 200H ;表示以字為單位定義2個(gè)數(shù)據(jù) str db Hello;給出帶單引號(hào)的字符等于給出了字符的ASCII碼 addr1 dw str ;將變量str所代表的偏移地址賦給變量addr1 addr2 dd str;將變量str所代表的偏移地址和段地址賦給addr22. 偶地址對(duì)齊偽指令:EVEN 用于判斷當(dāng)前存儲(chǔ)單元是否為偶地址,假設(shè)是那么無操作,否那么讓下一個(gè)數(shù)據(jù)或代碼從偶地址開始存放3. 指定起始位置偽指令:ORG ORG 20H;指定下一個(gè)數(shù)據(jù)或代碼從0020H開始存放4. 重復(fù)表達(dá)式偽指令:DUP buf db 10 dup(?) ;表示以字節(jié)為單位定義數(shù)據(jù),重復(fù)1
15、0次,即定義10 個(gè)數(shù)據(jù),表示重復(fù)的內(nèi)容,?表示只分配存儲(chǔ)單元,但不賦初值炳略無斃屢丈索瑣恕窩碎龜螞硒腕足膳光巡郭啞謬幢斜迪勢(shì)隆怨歪闡營嗚第4章 匯編語言第4章 匯編語言匯編語言偽指令5. 賦值偽指令:EQU 類似于C語言中的define,不分配存儲(chǔ)單元 AAA EQU 10 ;以符號(hào)AAA表示數(shù)據(jù)10,編譯時(shí)把程序中所有出現(xiàn) ;AAA的地方用10替換,也可用 AAA = 10 表示 BBB EQU AAA ;用符號(hào)BBB表示另一個(gè)符號(hào)AAA6. 段定義及程序定義偽指令:segment/end proc/endp far/near7. 程序結(jié)束偽指令:END 表示整個(gè)程序結(jié)束8. 類型說明偽指
16、令:byte ptr, word ptr, dword ptr, near ptr,far ptr9. 其他偽指令:OFFSET;析取變量、標(biāo)號(hào)和過程名的偏移量SEG;析取變量、標(biāo)號(hào)和過程名的段地址TYPE;析取變量、標(biāo)號(hào)和過程名的類型取值:DB 1, DW 2, DD 4, DQ 8, DT 10,NEAR -1, FAR -2萊霞塔殘物私緩思漬戲鋼架命職椿叉嬸砌懇卯憐邵假滯祖諄佳匡影袖濱客第4章 匯編語言第4章 匯編語言返回操作系統(tǒng)方法主程序退出返回操作系統(tǒng)的三種方法 A、利用INT 20H結(jié)束程序 code segment main proc far int 20h main endp
17、code ends end mainB、利用DOS功能調(diào)用4CH退出code segment main proc far mov ax, 4C00h int 21h main endpcode ends end mainC、利用程序段前綴PSP返回code segment main proc far push ds xor ax, ax;將AX清0 push ax ret main endpcode ends end main 程序裝入內(nèi)存后,系統(tǒng)將CS:IP、SS:SP分別指向代碼段和堆棧段起始位置,而DS、ES指向PSP+0處,程序結(jié)束時(shí),RET指令返回PSP+0H處執(zhí)行INT 20H指令
18、,釋放程序占用的存儲(chǔ)器空間,并返回操作系統(tǒng)。芬刁當(dāng)?shù)A光直古澡斬裂泰肯繃砸附霉伙梗茂憫花喇身碑需夸彝搏遞央賀哮第4章 匯編語言第4章 匯編語言匯編語言程序設(shè)計(jì)第4.2節(jié) 匯編語言程序設(shè)計(jì)常用DOS功能調(diào)用 通常把DOS提供的INT 21H中斷效勞程序稱為DOS功能調(diào)用,調(diào)用時(shí)根據(jù)AH的值來選擇子功能。AH=1 鍵盤鍵入并回顯, 輸入字符的ASCII碼在AL中返回 例: MOV AH, 1 INT 21HAH=2 顯示輸出字符,輸出字符的ASCII碼放入DL中 例: MOV AH, 2 MOV DL, A INT 21HAH=7 鍵盤輸入無回顯,輸入字符的ASCII碼在AL中返回 例: MOV A
19、H, 7 INT 21H搞優(yōu)扼宏馱港矢葉奸燙臻寬維羽潔攝晃征暫左秘志核餾縣夢(mèng)依吧緝喪著摟第4章 匯編語言第4章 匯編語言DOS功能調(diào)用AH=9 顯示字符串,字符串以$結(jié)束,開始位置用DS: DX指示 例: MOV AX, MY_DATA MOV DS, AX LEA DX, String MOV AH, 9 INT 21HAH=4C 程序運(yùn)行結(jié)束,返回操作系統(tǒng),返回碼由AL給出 例: MOV AX, 4C00H INT 21H 程序設(shè)計(jì)實(shí)例包括6局部順序結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)子程序設(shè)計(jì)字符串程序設(shè)計(jì)數(shù)碼轉(zhuǎn)換程序設(shè)計(jì)孕講賤殲想擲些平刷叉礬漾孟蕊傍詐吊犁錘騎活栓具傻趴鈞戒予誓
20、填酵黍第4章 匯編語言第4章 匯編語言順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)程序設(shè)計(jì)例1 從鍵盤輸入一個(gè)小寫字母,轉(zhuǎn)換成大寫字母輸出 data segment para str1 db Please input ( a z ): $ str2 db 0dh,0ah,The result is: $data endsss_seg segment stack dw 100 dup(0)ss_seg endscode segmentassume cs:code, ss:ss_seg, ds: data main proc farmov ax, data ;對(duì)數(shù)據(jù)段賦值mov ds, axlea dx, str1
21、;ds:dx指向str1mov ah, 9 ;顯示提示符1int 21h mov ah, 1 ;輸入小寫字符 int 21h sub al, 20h ;得到大寫字母ASCII push ax ;放入堆棧保存 lea dx, str2 ;ds:dx指向str2 mov ah, 9 ;顯示提示符2 int 21h pop ax ;從堆?;謴?fù)AX值 mov ah, 2 ;輸出大寫字符 mov dl, al int 21h mov AX, 4c00h;返回DOS int 21h main endpcode ends end maina z 61H 7AHA Z 41H 5AH羊扶遂肥路旅絡(luò)瓊遺會(huì)驅(qū)穩(wěn)拜
22、崇沛渺額剮娩沛調(diào)莫盒擊蕭柱伏或撮鷹淌愉第4章 匯編語言第4章 匯編語言順序結(jié)構(gòu)程序設(shè)計(jì)例2 以16進(jìn)制形式顯示存儲(chǔ)器中一個(gè)字節(jié)的無符號(hào)數(shù)VAR, 例: 1101 0101 顯示 D5 方法:將一個(gè)字節(jié)分為高4位和低4位,先顯示高4位,后顯示低4位,data segment para vardb 100data endsss_seg segment stack dw100 dup(0)ss_seg endscodesegment assume cs:code, ds:data, ss:ss_seg main proc far mov ax, data mov ds, ax mov al, var
23、mov dh,almov cl,4 shr al, cl call bin2asc call pchar mov al, dh call bin2asc call pchar;顯示al中一個(gè)字符 pchar proc mov ah, 02h mov dl, al int 21h ret pchar endpcode ends end main mov ax, 4c00h int 21hmain endpbin2asc proc and al, 0fh add al, 30h cmp al, 9 jbe asc1 add al, 7asc1: retbin2asc endp;將AL的低4位轉(zhuǎn)換;
24、為ASCII碼洼杠抹蔣抑呸羅緞蔣洲險(xiǎn)剎琶褲邢般瓣沮嫁夸旗弛淋克饒?zhí)K酶詹阿朝僳矯第4章 匯編語言第4章 匯編語言順序結(jié)構(gòu)程序設(shè)計(jì)例3 從鍵盤輸入15之間的一個(gè)數(shù),在屏幕上顯示onefive。 如輸入5,那么顯示fivedata segment para str1db one, $str2db Two, $ str3db Three, $ str4db four, $ str5db five, $ tab dw str1,str2,str3,str4,str5data endsssg segment stackdw 256 dup(?)ssg endscode segment paraassume
25、 cs:code,ss:ssg,ds:datamain proc farmov ax, datamov ds, axmov ah, 1 ;鍵盤輸入int 21hcall asc2bin mov bl, almov bh, 0dec bxshl bx, 1mov dx, tabbxmov ah, 9int 21hmov ax, 4c00hInt 21h main endp;將ASCII轉(zhuǎn)換為二進(jìn)制數(shù);入口:AL存放ASCII;出口:轉(zhuǎn)換后數(shù)值在ALasc2bin procsub al, 30hcmp al, 9jbe nextsub al, 7next: retasc2bin endpendma
26、in舞閉茂床爽赫紛回幻陽卿微醉茨那喻華少菜倍娃徐音訣廖誠兒觸住擒辨嘶第4章 匯編語言第4章 匯編語言分支結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)程序設(shè)計(jì)二分支結(jié)構(gòu)例4 在數(shù)據(jù)段中有兩個(gè)16位二進(jìn)制無符號(hào)數(shù)data1和data2,找出其中較小數(shù),并存于MIN中data segment data1 dw 2000h data2 dw 3f80h min dw ?data endsss_seg segment stack dw 100 dup(0)ss_seg endscode segment assume cs:code, ds:data, ss:ss_seg main proc far mov ax, data m
27、ov ds, ax mov ax, data1 cmp ax, data2 jb next mov ax, data2next: mov min, ax mov ax, 4c00h int 21h main endpcode ends end main騎舍莢羔畏滁壟析柱詞纖戈尋羌品兵落操般鄲貳蟹爾烴翰鋒聶篇銳循睜狄第4章 匯編語言第4章 匯編語言分支結(jié)構(gòu)程序設(shè)計(jì)三分支機(jī)構(gòu)例5 判斷16位有符號(hào)數(shù)var的值,假設(shè)為正數(shù),在result中存入1;為負(fù)數(shù),在result中存入-1;為零,在result中存入0data segment var dw 2000h result dw ?data ends
28、ss_seg segment stack dw 100 dup(0)ss_seg endscode segment assume cs:code, ds:data, ss:ss_seg mainproc far mov ax, data mov ds, ax mov ax, var cmp ax, 0 jl less jg great ;mov ax, 0 jmp nextless: mov ax, -1 jmp nextgreat: mov ax, 1next: mov result, ax mov ax, 4c00h int 21h main endpcode ends end main赴
29、溺織怨夕宏牲審淪蹦奔雷蝶樁堯春雍餅曼豹擊仗呻螺耕肆溢明枉叁瘋筷第4章 匯編語言第4章 匯編語言分支結(jié)構(gòu)程序設(shè)計(jì)多分支機(jī)構(gòu)例6 根據(jù)字節(jié)變量var被置位的情況控制程序轉(zhuǎn)移到8個(gè)子程序中的一個(gè)data segment tab dw subr1, subr2, subr3, subr4 dw subr5, subr6, subr7, subr8 var db 04hdata endsss_seg segment stack db 100 dup(0)ss_seg endscode segmentassume cs: code, ds: data, ss: ss_seg main proc farmo
30、v ax, data mov ds, ax mov al, var cmp al, 0 jz exit movbx, 0getbit: shr al, 1 jc subr add bx, 2 jmp getbitsubr: call tabbxexit: mov ax, 4c00h int 21h main endp subr1 proc ret subr1 endp subr8 proc ret subr8 endpcode ends end main 變量var子程序0000 0001subr10000 0010subr20000 0100subr30000 1000subr40001 0
31、000subr50010 0000subr60100 0000subr71000 0000subr8政閱哲牢迄超晉致睦怎借凱汐乖莖匝虐能瑩素懦哮事齊址蔑嚴(yán)虜情窮礦囪第4章 匯編語言第4章 匯編語言循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)單重循環(huán)例7 以buf單元開始存放8個(gè)16位有符號(hào)數(shù) 請(qǐng)找出最大數(shù)存于max單元data segment buf dw -10, 300, 528, 222 dw 426, 923, 223, -36count equ ($-buf) / 2 max dw ?data endsss_eg segment stack dw 100 dup(0)ss_seg endscode
32、segment assume cs:code, ds:data, ss:ss_seg main proc farmov ax, data mov ds, axmov cx, count-1mov bx, 0mov ax, bufbxcircle: addbx, 2cmp ax, bufbxjge nextmovax, bufbx next: loop circlemov max, axmov ax, 4c00hint21h main endpcode ends end main白遣量律衫經(jīng)滯檬潘乾屁摔炭鮑尿憤澈鴛聞?chuàng)Ω械扛嫽仗J宦臻第4章 匯編語言第4章 匯編語言循環(huán)結(jié)構(gòu)程序設(shè)計(jì)例8
33、將5個(gè)有符號(hào)字節(jié)數(shù)相加,結(jié)果保存在sum中data segment para bufdb -100, 127, 112, 99, -10 sum dw 0data endsss_seg segment stack dw 100 dup(0)ss_seg endscode segment para assume cs:code, ss:ss_seg, ds: datamain proc farmovax, data movds, axmovcx, 5mov dx, 0 movbx, 0circle:mov al, bufbxcbw;字?jǐn)U展, ALAX adddx, ax;16位加法, 防止溢出i
34、ncbxloopcirclemovsum, dxmovax, 4c00hint21h main endpcode endsend main斗獰僅擺捕匹秤襪橋胯見剎矯荔月坐亨橇窄敲計(jì)磨使簍我酣淪映壤生默算第4章 匯編語言第4章 匯編語言循環(huán)結(jié)構(gòu)程序設(shè)計(jì)多重循環(huán)舉例:冒泡法排序例9 以buf單元開始連續(xù)存放10個(gè)16位有符號(hào)數(shù),請(qǐng)按由小到大排序data segment buf dw -10, 30, 52, 2, 92 dw 22, -36, -31, 63, 44 countequ ($-buffer) / 2data endsss_seg segment stack dw 100 dup(0)
35、ss_seg endscode segmentassume cs:code, ds:data, ss:ss_seg main proc farmov ax, datamov ds, axmov cx, count - 1circle1: movbx, 0 ;外循環(huán)pushcxcircle2:movax, bufbx ;內(nèi)循環(huán)cmpax, bufbx+2 ;比較數(shù)據(jù)jlenextxchgax, bufbx+2 ;交換數(shù)據(jù)movbufbx, axnext:addbx, 2loopcircle2 popcxloopcircle1movax, 4c00hint21h main endpcode end
36、sendmain碘扁魄睡躇較穎耘戴忻歉咯見凍苑救瞪臼貉啟鐮蚜商插獅奧耪孵見口瓜柜第4章 匯編語言第4章 匯編語言循環(huán)結(jié)構(gòu)程序設(shè)計(jì)冒泡法第二種實(shí)現(xiàn)data segment buf dw -10, 30, 52, 2, 92 dw 22, -36, -31, 63, 44 countequ ($-buffer) / 2data endsss_seg segment stack dw 100 dup(0)ss_seg endscode segmentassume cs:code,ds:data,ss:ss_seg main proc farmov ax, datamov ds, axmov cx,
37、count - 1circle1: movbx, 0movdx, 0pushcxcircle2:movax, bufbx cmpax, bufbx+2 jlenextxchgax, bufbx+2 movbufbx, axmovdx, 1;表示發(fā)生交換next:addbx, 2loopcircle2 popcxcmpdx, 0jzexitloopcircle1 exit: mov ax, 4c00h int 21h main endp code ends end main坪奸癢炙貼碼臍砍徐屆燦鑲組頤熟虜象呈礙均指譯饒落垛爾進(jìn)埂泌希藏霄第4章 匯編語言第4章 匯編語言子程序設(shè)計(jì)子程序設(shè)計(jì) 如何進(jìn)
38、入子程序,如何返回調(diào)用程序調(diào)用時(shí):CALL TAGET ;將返回地址壓入堆棧返回時(shí):RET ;從堆棧中彈出返回地址賦給CS和IP子程序中使用堆棧,應(yīng)保持動(dòng)態(tài)平衡 子程序參數(shù)傳遞方法存放器傳遞全局變量傳遞堆棧傳遞代碼段傳遞 子程序描述子程序功能描述入口參數(shù)描述出口參數(shù)描述區(qū)舅刑簇絕運(yùn)坤榴郵硼埂又固稻爹生軋武躥源智字涉沒撓天幟茸彪該屆氯第4章 匯編語言第4章 匯編語言子程序設(shè)計(jì)1. 存放器傳遞參數(shù);將 0 F 轉(zhuǎn)換為ASCII碼;入口參數(shù): 要轉(zhuǎn)換的數(shù)值放入AL低4位;出口參數(shù):轉(zhuǎn)換后的ASCII放入AL返回 moval, 3callbin2ascbin2asc proc and al, 0FH
39、add al, 30H cmp al, 9 jbe asc1 add al, 7asc1: retbin2asc endp2. 全局變量傳遞參數(shù);將2個(gè)無符號(hào)字?jǐn)?shù)據(jù)相加x dw ? y dw ? ;調(diào)用前將參數(shù)賦給全局變量movx, 8movy, 7calladd_sradd_sr proc movax, xaddax, yret ;返回時(shí),結(jié)果在AL中add_sr endp畸徘轟位趴語凹招逐腺桂仔坎司烙爺照監(jiān)法半仙很藐歧意老膀匪幀暴筆隱第4章 匯編語言第4章 匯編語言子程序設(shè)計(jì)3. 堆棧傳遞參數(shù) 高級(jí)語言多采用該方法例:將2個(gè)無符號(hào)字?jǐn)?shù)據(jù)相加;調(diào)用前將參數(shù)壓入堆棧mov ax, 8push
40、axmov ax, 7push axcall add_sr;子程序中如何訪問堆棧中參數(shù)?; BP 間接尋址 默認(rèn)堆棧段add_sr proc push bp mov bp, sp mov ax, bp+6 ;8 add ax, bp+4 ;7 pop bp ret 4 ;返回后,將SP+4,保;持堆棧平衡add_sr endp煤班塌豐燎秧塔弛井耕上瘍掃峙糾用蠻祭筷貝耐鎳成嘉陌述款湖憐辟阻吉第4章 匯編語言第4章 匯編語言子程序設(shè)計(jì)4. 代碼段傳遞參數(shù)例10 在數(shù)據(jù)段中有一個(gè)16位二進(jìn)制無符號(hào)數(shù)var,計(jì)算var*10+600的值, 并把結(jié)果存于result單元中,試編程。data segmen
41、t var dw 32767 result dd ?data endsssg segment stack dw 100 dup(?)ssg endscode segment assume cs:code,ds:data,ss:ssgstart proc far mov ax, data mov ds, axmov ax, varcall funcA:dw 10dw 600B:lea bx, resultmov bx, axmov bx+2, dxmov ax, 4c00h int 21hstart endpfunc proc push bp mov bp, sp push si push bx
42、 mov bx, bp+2 mov si, cs:bx ;10 mul si ;var*10 add ax, cs:2bx ;600 adc dx, 0 add bx, 4 mov bp+2, bx pop bx pop si pop bp ret func endpcode ends end start磐劇髓怪逮鹵遵緯撾映庶宗司遠(yuǎn)腿糕等磊匙鄉(xiāng)齋掀京耙狂研窄獵勉材搖厭第4章 匯編語言第4章 匯編語言字符串程序設(shè)計(jì)字符串程序設(shè)計(jì)例11 顯示一個(gè)字符串,結(jié)束符為NULL字符data segment str1 db Welcome! , 0data endsssg segment stack dw
43、100 dup(0)ssg endscode segmentassume cs:code,ds:data,ss:ssg main proc far mov ax, data mov ds, ax lea si, str1 call pstr mov ax, 4c00hmov ax, 4c00h int 21hmain endppstr proc cldpstr1: lodsb ;從串中取字符 cmp al, 0 ;判斷結(jié)束符 jz pstr2 call pchar ;顯示字符 jmp pstr1pstr2: retprtstr endppchar proc mov ah, 02h mov dl
44、, al int 21h retpchar endpcode ends end main洛鈾追儉選徐坡辟薩落的定掘?yàn)┳嬑疗憾锠I腺懇省才于稚蘆樁舀瓊倡片仰第4章 匯編語言第4章 匯編語言字符串程序設(shè)計(jì)例12 拷貝字符串strcpy.asm,把字符串str1拷貝到字符串str2 ;入口: si存放str1起始地址, di存放str2起始地址 ;出口: str1內(nèi)容被拷貝到str2,ax為str2起始地址strcpy proc mov ax, ds mov es, ax movdi, dx ;es:di指向串2 mov dx, di ;保存串2地址 repmovsb mov di, si ;es:d
45、i指向串1 movax, dx xor al, alret mov cx, 0ffffh strcpy endp cld repnz scasb not cx ;cx為含0源串長度碰暇畦檬擬跌雀彰坦伺她喚粹晦簿捧儡寓精桿衍隅鞘歹瘓白憾莢任佛嗎敬第4章 匯編語言第4章 匯編語言數(shù)碼轉(zhuǎn)換程序設(shè)計(jì)數(shù)碼轉(zhuǎn)換程序設(shè)計(jì)1. 二進(jìn)制轉(zhuǎn)換為十進(jìn)制ASCII碼例13 以10進(jìn)制格式顯示一個(gè)無符號(hào)字?jǐn)?shù)據(jù)分析: 1) 存儲(chǔ)時(shí)用二進(jìn)制,書寫時(shí)用16進(jìn)制或10進(jìn)制 如:127 存儲(chǔ):0111 1111b 書寫:7FH 2二進(jìn)制如何轉(zhuǎn)換為10進(jìn)制,即得到萬位、千位、個(gè)位 如:127,每次除以10,保存余數(shù) 7 37H2
46、32H 1 31H 注:09 30H39H 3顯示時(shí),使用ASCII碼, AH=2 DOS功能調(diào)用輸出字符雇辜坊萄娥節(jié)攤褒專港蘿廄擴(kuò)閥斑補(bǔ)綏巫底玲貼之蟹救溪堤猿綸達(dá)螢摧孟第4章 匯編語言第4章 匯編語言數(shù)碼轉(zhuǎn)換程序設(shè)計(jì)var dw 7FH;數(shù)據(jù)定義buf db 5 dup( ) ;初始化為空格 mov bx, 4mov si, 10mov dx, 0 mov ax, vardiv si ;(DX,AX) / 10add dl, 30h ;得到個(gè)位 mov bufbx, dl;mov dx, 0 div si add dl, 30h;得到十位dec bx mov bufbx, dl;mov dx
47、, 0div si add dl, 30h ;得到百位dec bx mov bufbx, dl ;可繼續(xù)得到千位、萬位;顯示十進(jìn)制數(shù)mov bx, 0mov dl, bufbxmov ah, 2int 21h;顯示萬位;inc bxmov dl, bufbx mov ah, 2int 21h ;顯示千位 .孤酣鍺釀節(jié)而獄訂貿(mào)眨計(jì)瘟自圈移服鐘菩然驟址對(duì)媳叮嚴(yán)碉修諸薩趁蔡佐第4章 匯編語言第4章 匯編語言數(shù)碼轉(zhuǎn)換程序設(shè)計(jì)circle1:movdx, 0divsi ;除以10adddl, 30hmovbufbx, dldecbxloopcircle1movcx, 5 ;顯示5位數(shù)據(jù)movbx, 0c
48、ircle2:movdl, bufbxmovah, 2int21hloopcircle2movax, 4c00hint21h main endpcode ends end main 優(yōu)化后的完整匯編程序data segment var dw 7F00H buf db 5 dup ( ) data ends ssg segment stack dw 100 dup(0)ssg endscode segmentassume cs:code,ds:data,ss:ssgmain proc far mov ax, data mov ds, ax mov cx, 5 mov bx, 4 mov si,
49、10 mov ax, var熄渣朗亞室匝蝕潛嚏擊咆鞠畫戮死千鐐芥寂奧哄心圾睜廣玖咀執(zhí)腿撕忠炭第4章 匯編語言第4章 匯編語言數(shù)碼轉(zhuǎn)換程序設(shè)計(jì)例14 以10進(jìn)制格式顯示一個(gè)有符號(hào)字?jǐn)?shù)據(jù)data segment dat dw 900Ah buf db 6 dup ( ) data ends ssg segment stack dw 100 dup(0)ssg endscode segmentassume cs:code,ds:data,ss:ssgmain proc far mov ax, data mov ds, ax mov buf , + cmp var, 0 jge next mov bu
50、f, - neg varnext: mov cx, 5 mov bx, 5 mov si, 10 mov ax, varcircle1: mov dx, 0 div si add dl, 30h mov bufbx, dl dec bx loop circle1 mov cx, 5 mov bx, 0circle2: mov dl, bufbx mov ah, 2 int 21h inc bx loop circle2 mov ax, 4c00h int 21h main endp code ends end main蠟致哭麓共波鉤祈鐳該郝肪擎俞焚訟旱弟胳剎兵融球喬競(jìng)脹痕失州無塢佰第4章 匯編
51、語言第4章 匯編語言數(shù)碼轉(zhuǎn)換程序設(shè)計(jì)2. BCD碼轉(zhuǎn)換為二進(jìn)制數(shù)例15 將一個(gè)位壓縮BCD碼數(shù),轉(zhuǎn)化為二進(jìn)制數(shù)分析:var dw 1024H 看作壓縮BCD碼,表示十進(jìn)制數(shù),大小應(yīng)為 1024 因此轉(zhuǎn)換成二進(jìn)制數(shù)后,在存儲(chǔ)器中應(yīng)該存放為 0400H方法:轉(zhuǎn)換后數(shù)據(jù) = 千位*1000 + 百位*100 + 十位*10 + 個(gè)位 采用循環(huán)實(shí)現(xiàn) 數(shù)據(jù) = (千位*10 + 百位)*10 + 十位)*10 + 個(gè)位 數(shù)據(jù) = (BCD3*10+ BCD2)*10 + BCD1)*10 + BCD0 1024 = (1H * 10 + 0H) * 10 + 2H) * 10 + 4H 第1次: ax = 1H * 10 + 0H 第2次: ax = ax * 10 + 2H 第3次: ax = ax * 10 + 4HBCD1BCD0BCD3BCD2var低8位高8位謎眩讒芹癥嚼妥啼斷檻蝕管紐酥秉練札搐痹剿士姆渙寄榨煤漏只汲謾梗驅(qū)第4章 匯編語言第4章 匯編語言數(shù)碼轉(zhuǎn)換程序設(shè)計(jì) mov ax, 0cirlce: mul si ;乘以10 rol var
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 三年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)匯編及答案
- 春節(jié)餐飲盛宴之道
- 實(shí)習(xí)班主任班級(jí)工作參考計(jì)劃
- 二零二五年度國有企業(yè)股權(quán)認(rèn)購與改革合作協(xié)議3篇
- 臨床頸椎A(chǔ)CAF 技術(shù)步驟要點(diǎn)
- 國際兒童廣播電視日
- 主題三:紅色之美 第16課《鄉(xiāng)村振興-戰(zhàn)旗村的崛起》(說課稿)川教版四年級(jí)上冊(cè)綜合實(shí)踐活動(dòng)
- 貴州貴陽市普通中學(xué)2024-2025學(xué)年高一上學(xué)期期末監(jiān)測(cè)歷史試題(含答案)
- 冀教版小學(xué)信息技術(shù)四年級(jí)上冊(cè)《第1課 制作月歷》說課稿
- 河南省安陽市(2024年-2025年小學(xué)六年級(jí)語文)部編版隨堂測(cè)試(下學(xué)期)試卷及答案
- 血細(xì)胞分析報(bào)告規(guī)范化指南2020
- 《中國近現(xiàn)代史綱要(2023版)》課后習(xí)題答案合集匯編
- 上海外國語大學(xué)附屬外國語學(xué)校2020-2021七年級(jí)下學(xué)期期中英語試卷+答案
- 綠色施工措施措施 四節(jié)一環(huán)保
- TCSES 71-2022 二氧化碳地質(zhì)利用與封存項(xiàng)目泄漏風(fēng)險(xiǎn)評(píng)價(jià)規(guī)范
- GB/T 8561-2001專業(yè)技術(shù)職務(wù)代碼
- GB/T 7661-2009光學(xué)零件氣泡度
- GB/T 4745-2012紡織品防水性能的檢測(cè)和評(píng)價(jià)沾水法
- GB/T 16857.1-2002產(chǎn)品幾何量技術(shù)規(guī)范(GPS)坐標(biāo)測(cè)量機(jī)的驗(yàn)收檢測(cè)和復(fù)檢檢測(cè)第1部分:詞匯
- GB 28261-2012安全氣囊氣體發(fā)生器用點(diǎn)火具生產(chǎn)安全技術(shù)條件
- RT qPCR(實(shí)時(shí)熒光定量PCR)課件
評(píng)論
0/150
提交評(píng)論