1632位微機(jī)原理、匯編語(yǔ)言及接口技術(shù)第三章課后習(xí)題答案_第1頁(yè)
1632位微機(jī)原理、匯編語(yǔ)言及接口技術(shù)第三章課后習(xí)題答案_第2頁(yè)
1632位微機(jī)原理、匯編語(yǔ)言及接口技術(shù)第三章課后習(xí)題答案_第3頁(yè)
1632位微機(jī)原理、匯編語(yǔ)言及接口技術(shù)第三章課后習(xí)題答案_第4頁(yè)
1632位微機(jī)原理、匯編語(yǔ)言及接口技術(shù)第三章課后習(xí)題答案_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第3章 3.1 :匯編語(yǔ)言有什么特點(diǎn) 解: 匯編語(yǔ)言是一種以處理器指令系統(tǒng)為基礎(chǔ)的低級(jí)程序設(shè)計(jì)語(yǔ)言,它采用助記符表達(dá)指令 操作碼,采用標(biāo)識(shí)符號(hào)表示指令操作數(shù),可以直接、有效地控制計(jì)算機(jī)硬件,因而容易創(chuàng)建 代碼序列短小、運(yùn)行快速的可執(zhí)行程序 3.2編寫匯編語(yǔ)言源程序時(shí),一般的組成原則是什么? 解: (1)完整的匯編語(yǔ)言源程序由段組成 (2)個(gè)匯編語(yǔ)言源程序可以包含若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段 之間的順序可隨意排列 (3)需獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段,并指示程序執(zhí)行的起始點(diǎn),一個(gè)程序只 有一個(gè)起始點(diǎn) (4)所有的可執(zhí)行性語(yǔ)句必須位于某一個(gè)代碼段內(nèi),說(shuō)明性語(yǔ)句可根據(jù)需要位于任一

2、 段內(nèi) (5)通常,程序還需要一個(gè)堆棧段 3.3 MODE偽指令是簡(jiǎn)化段定義源程序格式中必不可少的語(yǔ)句,它設(shè)計(jì)了哪7種存儲(chǔ)模式? 各用于創(chuàng)建什么性質(zhì)的程序? 解: 存儲(chǔ)模式 特點(diǎn) TINY COM類型程序,只有一個(gè)小于64KB的邏輯段(MASM 6.x支持) SMALL 小應(yīng)用程序,只有一個(gè)代碼段和一個(gè)數(shù)據(jù)段(含堆棧段),每段不大于64KB COMPACT 代碼少、數(shù)據(jù)多的程序,只有一個(gè)代碼段,但有多個(gè)數(shù)據(jù)段 MEDIUM 代碼多、數(shù)據(jù)少的程序,可有多個(gè)代碼段,只有一個(gè)數(shù)據(jù)段 LARGE 大應(yīng)用程序,可有多個(gè)代碼段和多個(gè)數(shù)據(jù)段(靜態(tài)數(shù)據(jù)小于64KB) HUGE 更大應(yīng)用程序,可有多個(gè)代碼段和多

3、個(gè)數(shù)據(jù)段(對(duì)靜態(tài)數(shù)據(jù)沒(méi)有限制) FLAT 32位應(yīng)用程序,運(yùn)行在 32位80 x86CPU和 Windows 9x或NT環(huán)境 3.4如何規(guī)定一個(gè)程序執(zhí)行的開始位置,主程序執(zhí)行結(jié)束應(yīng)該如何返回DOS源程序在何處 停止匯編過(guò)程? 解: 開始位置:用標(biāo)號(hào)指明 返回DOS利用DOS功能調(diào)用的4CH子功能來(lái)實(shí)現(xiàn) 匯編停止:執(zhí)行到一條 END偽指令時(shí),停止匯編 3.5邏輯段具有哪些屬性? 解: 段定位、段組合和段類型。 3.6 給出采用一個(gè)源程序格式書寫的例題 3.1 源程序 例題3.1 :創(chuàng)建一個(gè)在屏幕上顯示一段信息的程序解: stack segment stack db 1024(0) stack e

4、nds data segment string db Hello,Assembly! , 0dH, 0aH, $ data ends code segment code assume cs:code,ds:data,ss:stack start: mov dx,offset string mov ah,9 int 21h code ends end start 3.7DOS支持哪兩種可執(zhí)行程序結(jié)構(gòu),編寫這兩種程序時(shí)需要注意什么? 解: (1) . EXE 程序 程序可以有多個(gè)代碼段和多個(gè)數(shù)據(jù)段,程序長(zhǎng)度可以超過(guò)64KB 通常生成EXE結(jié)構(gòu)的可執(zhí)行程序 (2) . COM 程序 只有一個(gè)邏輯段,

5、程序長(zhǎng)度不超過(guò) 64KB 需要滿足一定條件才能生成COM吉構(gòu)的可執(zhí)行程序(MASM 6.x需要采用TINY模式) 3.8舉例說(shuō)明等價(jià)“ EUQ偽指令和等號(hào)“=”偽指令的用途 解: 符號(hào)定義偽指令有“等價(jià) EQU和“等號(hào)=”: 符號(hào)名 EQU 數(shù)值表達(dá)式 符號(hào)名 EQU 符號(hào)名=數(shù)值表達(dá)式 EQU用于數(shù)值等價(jià)時(shí)不能重復(fù)定義符號(hào)名,但“=”允許有重復(fù)賦值。例如: X= 7;等效于: X equ 7 X= X+5;“X EQU X+5 是錯(cuò)誤的 3.9 給出下列語(yǔ)句中,指令立即數(shù)(數(shù)值表達(dá)式)的值 (1) mov al,23h AND 45h OR 67h (2) mov ax,1234h/16+1

6、0h 3:mov ax,23h SHL 4 4:mov al,aand(NOT(a- A) 5:mov ax,(76543 LT 32768) XOR 7654h 解: 1) al=67h 2) ax=133h,dx=4h 3) ax=0230h 4) al=41h 4) ax=7654h 3.10 畫圖說(shuō)明下列語(yǔ)句分配的存儲(chǔ)空間及初始化的數(shù)據(jù)值 (1) byte_var db abc ,10,10h, EF ,3 dup(-1,?,3,dup(4) (2:)word_var dw 10h,-5,3,dup(?) 解: (1) 41 4 4 1 ri 45h 46h -1 ? 4 4 4 -1

7、 ? 4 4 4 -1 ? 4 4 4 h 2 3 0 0 h h h (2) 10h 00h 0fbh 0ffh ? ? ? ? ? ? 3.11 請(qǐng)?jiān)O(shè)置一個(gè)數(shù)據(jù)段,按照如下要求定義變量: (1) my1b為字符串常量,表示字符串personal Computer ” my2b為用十進(jìn)制數(shù)表示的字節(jié)變量,這個(gè)數(shù)的大小為20 (3) my3b為用十六進(jìn)制數(shù)表示的字節(jié)變量,這個(gè)數(shù)的大小為20 (4) my4b為用二進(jìn)制數(shù)表示的字節(jié)變量,這個(gè)數(shù)的大小為20 (5) my5w為20個(gè)未賦值的字變量 (6) my6c為100的符號(hào)常量 my7c為字符串常量,代替字符串personal Computer

8、 ” 解:.data my1b db Pers onal Computer my2b db 20 my3b db 14h my4b db 00010100b my5w dw 20 dup(?) my6c = 100 my7c = vPers onal Computer 3.12希望控制變量或程序代碼在段中的偏移地址,應(yīng)該使用哪個(gè)偽指令? 解: 利用定位偽指令控制,如org,eve n,alig n 3.13名字和符號(hào)有什么屬性? 解: 包括邏輯地址和類型兩種屬性。 3.14設(shè)在某個(gè)程序中有如下片段,請(qǐng)寫出每條傳送指令執(zhí)行后寄存器AX的內(nèi)容: ;數(shù)據(jù)段 Org 100h Varwdw 1234h

9、,5678h Varbdb 3,4 Varddd 12345678h Buffdb 10 dup(?) Messdb hello ;代碼段 Mov ax,offset mess Mov ax,type buff+type mess+type vard Mov ax,sizeof varw+sizeof buff+sizeof mess Mov ax,le ngthof varw+le ngthof vard 解: org 100h varw dw 1234h J 5678h varb db 3 , 4 vard dd 12345678h buff dd 10 dup(?) mess db He

10、llo ;代碼段 mov ax J offset varb + offset mess mov ax J type buff + type mess + type mov ax J sizeof varw+ sizeof buff+ sizeof mess mov ax J lengthof varw+ lengthof vard ;數(shù)據(jù)段 vard 3.15 假設(shè) myword 是一個(gè)字變量, mybyte1 和 mybyte2 是兩個(gè)字節(jié)變量, 指出下列語(yǔ)句中的 具體錯(cuò)誤原因。 (1) mov byte ptr bx,1000 (2) mov bx,offset mywordsi (3)

11、cmp mybyte1,mybyte2 (4) mov mybyte1,al+1 (5) sub al,myword (6) jnz myword 解: (1) 1000 超過(guò)一個(gè)字節(jié)所能表達(dá)的最大整數(shù) ( 2) SI 應(yīng)為偶數(shù) (3)兩個(gè)內(nèi)存單元不能直接運(yùn)算 ( 4)應(yīng)改為 al+1 (5)條件轉(zhuǎn)移指令后面應(yīng)接標(biāo)號(hào),而不是變量 3.16 編寫一個(gè)程序,把從鍵盤輸入的一個(gè)小寫字母用大寫字母顯示出來(lái) 解: mov ah,1 ;只允許輸入小寫字母 int 21h sub al,20h ;轉(zhuǎn)換為大寫字母 mov dl,al mov ah,2 int 21h ;顯示 3.17已知用于LED數(shù)碼管的顯示

12、代碼表為: LEDtable db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h db 80h,90h,88h,83h,0c6h,0c1h,86h,8eh 它依次表示09, AF這16個(gè)數(shù)碼的顯示代碼。 現(xiàn)編寫一個(gè)程序?qū)崿F(xiàn)將led num中的一 個(gè)數(shù)字(09, af )轉(zhuǎn)換成對(duì)應(yīng)的LED顯示代碼 解: mov bx,offset LEDtable mov al,lednum xlat 3.18 編制一個(gè)程序,把變量 bufX 和 bufY 中較大者存入 bufZ ;若兩者相等,則把其中之 一存入 bufZ 中。假設(shè)變量存放的是 8 位有符號(hào)數(shù)。 解: mov ax,

13、 bufX cmp ax, bufY jae done mov ax, bufY done: mov bufZ, ax 3.19 為有符號(hào) 16位數(shù),請(qǐng)將它們的符號(hào)狀態(tài)保存在 signX ,即:如果變量值大于等于 0, 保存 0;如果 X 小于 0,保存 -1 。編寫該程序。 設(shè)變量 bufX 解: .model small .stack .data bufXdw -7 signXdb ? .code .startup cmp bufX,0 ;test bufX,80h jl next ;jnz next mov signX,0 jmp done next:mov signX,-1 done:

14、.exit 0 end 3.20bufX 、bufY 和 bufZ 是 3 個(gè)有符號(hào) 16 進(jìn)制數(shù),編寫一個(gè)比較相等關(guān)系的程序 (1)如果這 3 個(gè)數(shù)都不相等,則顯示 0 (2)如果這三個(gè)數(shù)中有兩個(gè)數(shù)相等,則顯示1 (3)如果這三個(gè)數(shù)都相等,則顯示2 解: mov dl, 2 mov ax,bufX cmp ax,bufY je next1 dec dl next1: cmp ax,bufZ je next2 dec dl next2: mov ah,2 int 21h 3.21 例 3.7 中,如果要實(shí)現(xiàn)所有為 1 的位都順序執(zhí)行相應(yīng)的處理程序段 (而不是例題中僅 執(zhí)行最低為 1 位的處理程

15、序段),請(qǐng)寫出修改后的代碼段? 解: ; 代碼段 mov al,number mov bx,0;BX J記錄為1的位數(shù) restart: cmp al,0;AL = 0 結(jié)束 jz done again: shr al,1;最低位右移進(jìn)入CF jc next;為 1,轉(zhuǎn)移 inc bx;不為 1,繼續(xù) jmp again next: push ax push bx shl bx,1;位數(shù)乘以 2(偏移地址要用 2個(gè)字節(jié)單元) jmp addrsbx;間接轉(zhuǎn)移:IP J table + BX ; 以下是各個(gè)處理程序段 fun0: mov dl,0 jmp disp fun1: mov dl,1

16、jmp disp fun2: mov dl,2 jmp disp fun3: mov dl,3 jmp disp fun4: mov dl,4 jmp disp fun5: mov dl,5 jmp disp fun6: mov dl,6 jmp disp fun7: mov dl,7 jmp disp disp: J mov ah,2;顯示一個(gè)字符 int 21h pop bx pop ax jmp restart done: 3.22 編制程序完成 12H 45H、0F3H 6AH 20H、OFEH 90H 0C8H 57H 和 34H等 10 個(gè) 字節(jié)數(shù)據(jù)之和,并將結(jié)果存入字節(jié)變量SUM

17、中 (不考慮溢出和進(jìn)位)。 ;wjxt322.asm .model small .stack .data b_data num sum db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h;原始數(shù)據(jù) equ 10;數(shù)據(jù)個(gè)數(shù) db ?;預(yù)留結(jié)果單元 .code .startup xor si, si;位移量清零 again: xor al, al mov cx, num add al, b_datasi inc si loop again mov sum, al .exit 0 ;取第一個(gè)數(shù) ;累加次數(shù) ;累加 ;指向下一個(gè)數(shù) ;如未完,繼續(xù)累加 ;完了,存

18、結(jié)果 end 3.23 求主存 0040h: 0 開始的一個(gè) 64KB物理段中共有多少個(gè)空格 ; wjxt323.asm .model small .code ;送段地址 ;偏移地址 ;計(jì)數(shù)(循環(huán)次數(shù)) ;空格計(jì)數(shù)器清零 ;與空格的 ASCII 碼比較 ;不是空格,轉(zhuǎn) ;是空格,空格數(shù)加 1 ;修改地址指針 ;ex = ex 1,女口 ex = 0退出循環(huán) start:mov ax,0040h mov ds, ax mov si, 0 mov cx, si xor ax, ax again: cmp byte ptr si, 20h jne next inc ax next: inc si l

19、oop again .exit 0 end start 3.24 編寫計(jì)算 100 個(gè) 16 位正整數(shù)之和的程序。如果和不超過(guò) 16 位字的范圍( 65535), 則保存其和到 wordsum,如超過(guò)則顯示overflow 。 答: ;數(shù)據(jù)段 eount parray wordsum msg equ 100 dw eount dup(?);假設(shè)有 100 個(gè)數(shù)據(jù) dw 0 db overflow , $ ;代碼段 mov ex,eount mov ax,0 mov bx,offset parray again: add ax,bx jne next mov dx,offset msg mov

20、ah,9 int 21h;顯示溢出信息 jmp done;然后,跳出循環(huán)體 next: add bx,2 loop again mov wordsum,ax done: 3.25 編程把一個(gè)16位無(wú)符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換成為用8421BCD碼表示的5位十進(jìn)制數(shù)。轉(zhuǎn)換 算法可以是:用二進(jìn)制數(shù)除以10000,商為“萬(wàn)位” ,再用余數(shù)除以 1000,得到“千位”; 依次用余數(shù)除以 100、10 和 1 , 得到 “百位”、“十位”和“個(gè)位” 。 ;wjxt325.asm .model small .stack 256 .data array dw ? ; 源字?jǐn)?shù)據(jù) dbcd db 5 dup(?) .co

21、de .startup ; 五位 bcd 結(jié)果,高對(duì)高低對(duì)低 mov dx, array ; 取源數(shù)據(jù)(余數(shù)) mov bx, 10000 ; 除數(shù) mov cx, 10 ; 除數(shù)系數(shù) mov si, 4 ; 目的數(shù)據(jù)高位位移量 again: mov ax, dx mov dx, 0 ; dx.ax 中存放被除數(shù) div bx ; 除于 bx ,商 ax ,余數(shù) dx mov dbcdsi, al ; 商v 10,存結(jié)果 push dx ; 暫存余數(shù) mov ax, bx mov dx,0 ; 除數(shù)除于 10 div cx ; dx.ax除于ex,商ax、余數(shù)0存在dx mov bx, ax

22、pop dx ; bx 是除數(shù) dec si jnz again ; 目的數(shù)據(jù)位移量減 1 mov dbcd, dl .exit 0 end ; 存?zhèn)€位數(shù)( 10) 3.26過(guò)程定義的一般格式是怎樣的?子程序開始為什么常有PUSH旨令?返回錢為什么常 有POP旨令?下面完成16位無(wú)符號(hào)數(shù)累加的子程序有什么不妥嗎?若有,請(qǐng)改正。 Carzy PROC Push ax Xor ax,ax Xor ax,dx Again add ax,bx Ade dx,0 Ine bx Ine bx Loop again Ret ENDP erazy 解: (1)匯編語(yǔ)言中,子程序要用一對(duì)過(guò)程偽指令PROC和EN

23、DP聲明,格式如下: 過(guò)程名 PROC NEAR|FAR ;過(guò)程體 過(guò)程名 ENDP (2)保護(hù)用到的寄存器內(nèi)容,以便子程序返回時(shí)進(jìn)行相應(yīng)的恢復(fù)。 (3)改錯(cuò): crazy proc pishbx pushcx xor ax,ax xor dx,dx again:add a,bx adc dx,0 inc bx inc bx loop again pop cx pop bx 3.27編寫一個(gè)源程序,在鍵盤上按一個(gè)鍵,將從AL返回的ASCH碼值顯示出來(lái),如果按 下ESC鍵則程序退出。 解(不需調(diào)用HTOASCF程序): again: mov ah,1 int 21h cmp al,1bh; ES

24、C的 ASCII 碼是 1bh je done mov dl,al mov ah,2 int 21h;是大寫字母則轉(zhuǎn)換為小寫字母 jmp again done: 3.28 請(qǐng)按如下說(shuō)明編寫子程序: ;子程序功能:把用 ASCH碼表示的兩位十進(jìn)制數(shù)轉(zhuǎn)換為對(duì)應(yīng)二進(jìn)制數(shù) ;入口參數(shù):DH=十位數(shù)的 ASCH碼,DL位數(shù)的 ASCH碼 ;出口參數(shù):AL=M應(yīng)的二進(jìn)制數(shù) 解答: asctobproc push cx and dh,0fh;先轉(zhuǎn)換十位數(shù) shl dh,1;十位數(shù)乘以 10(采用移位指令) mov ch,dh shl dh,1 shl dh,1 add dh,ch and dl,0fh;轉(zhuǎn)換

25、個(gè)位數(shù) add dh,dl;十位數(shù)加個(gè)位數(shù) mov al,dh;設(shè)置出口參數(shù) pop cx ret asctobendp 3.29 調(diào)用 HTOAS(子程序,顯示一個(gè)字節(jié)的16進(jìn)制數(shù),后跟“ H的子程序。 解: DIPASC proc;入口參數(shù):AL要顯示的一個(gè)16進(jìn)制數(shù) push cx push dx push ax mov cl,4;轉(zhuǎn)換高位 shr al,cl call HTOASC mov dl,al;顯示 mov ah,2 int 21h pop ax;轉(zhuǎn)換低位 call HTOASC mov dl,al;顯示 mov ah,2 int 21h mov dl, H;顯示一個(gè)字母“ H

26、” mov ah,2 int 21h pop dx pop cx ret DIPASC HTOASC endp proc;將AL低4位表達(dá)的一位16進(jìn)制數(shù)轉(zhuǎn)換為 ASCII碼 and al,0fh cmp al,9 jbe htoasc1 add al,37h;是 0AH- 0FH,力口 37H轉(zhuǎn)換為 ASCII 碼 ret; 子程序返回 htoasc1: add al,30h;是 09,力口 30H 轉(zhuǎn)換為 ASCII 碼 ret; 子程序返回 HTOASC endp 3.30寫一個(gè)子程序,根據(jù)入口參數(shù) AL=0 1、2,依次實(shí)現(xiàn)對(duì)大寫字母轉(zhuǎn)換成小寫、小寫轉(zhuǎn) 換成大寫或大小字母互換。欲轉(zhuǎn)換的

27、字符串在 string 中,用 0 表示結(jié)束 解: lucase proc push bx mov bx,offset string cmp al,0 je case0 cmp al,1 jz case1 cmp al,2 jz case2 jmp done case0: cmp byte ptr bx,0 je done cmp byte ptr bx, A jb next0 cmp byte ptr bx, Z next0: ja next0 add byte ptr bx,20h inc bx case1: jmp case0 cmp byte ptr bx,0 je done cmp

28、byte ptr bx, a jb next1 cmp byte ptr bx, z next1: ja next1 sub byte ptr bx,20h inc bx case2: jmp case1 cmp byte ptr bx,0 je done cmp byte ptr bx, A jb next2 cmp byte ptr bx, Z next20: ja next20 add byte ptr bx,20h jmp next2 cmp byte ptr bx, a jb next2 cmp byte ptr bx, z next2: ja next2 sub byte ptr

29、bx,20h inc bx done: jmp case2 pop bx lucase ret endp 3.31 子程序的參數(shù)傳遞有哪些方法?請(qǐng)簡(jiǎn)單比較 解: ( 1)用寄存器傳遞參數(shù): 最簡(jiǎn)單和常用的參數(shù)傳遞方法是通過(guò)寄存器, 只要把參數(shù)存于約定的寄存器中就可以了 由于通用寄存器個(gè)數(shù)有限, 這種方法對(duì)少量數(shù)據(jù)可以直接傳遞數(shù)值, 而對(duì)大量數(shù)據(jù)只能 傳遞地址 采用寄存器傳遞參數(shù), 注意帶有出口參數(shù)的寄存器不能保護(hù)和恢復(fù), 帶有入口參數(shù)的寄 存器可以保護(hù)、也可以不保護(hù),但最好能夠保持一致 ( 2)用共享變量傳遞參數(shù) 子程序和主程序使用同一個(gè)變量名存取數(shù)據(jù)就是利用共享變量 (全局變量) 進(jìn)行參數(shù)傳

30、 遞 如果變量定義和使用不在同一個(gè)源程序中,需要利用PUBLIC EXTREF聲明 如果主程序還要利用原來(lái)的變量值,則需要保護(hù)和恢復(fù) 利用共享變量傳遞參數(shù), 子程序的通用性較差, 但特別適合在多個(gè)程序段間、 尤其在不同的程序模塊間傳遞數(shù)據(jù) ( 3)用堆棧傳遞參數(shù) 參數(shù)傳遞還可以通過(guò)堆棧這個(gè)臨時(shí)存儲(chǔ)區(qū)。 主程序?qū)⑷肟趨?shù)壓入堆棧, 子程序從堆棧 中取出參數(shù);子程序?qū)⒊隹趨?shù)壓入堆棧,主程序彈出堆棧取得它們 采用堆棧傳遞參數(shù)是程式化的, 它是編譯程序處理參數(shù)傳遞、 以及匯編語(yǔ)言與高級(jí)語(yǔ)言 混合編程時(shí)的常規(guī)方法 3.32 采用堆棧傳遞參數(shù)的一般方法是什么?為什么應(yīng)該特別注意堆棧平衡問(wèn)題。 解: 方法

31、:主程序?qū)⑷肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù);子程序?qū)⒊隹趨?shù)壓 入堆棧,主程序彈出堆棧取得它們 注意:壓棧與彈棧必須要一一對(duì)應(yīng)。 3.33 編寫一個(gè)求 32 位數(shù)據(jù)補(bǔ)碼的子程序,通過(guò)寄存器傳遞入口參數(shù) 解: 方法 1: neg32 proc ;入口參數(shù):DX.AX- 32位有符號(hào)數(shù) neg ax neg dx ;實(shí)現(xiàn)0 DX.AX功能 sbb dx,0 ;這條指令也可以用 dec dx 代替 ret neg32 方法 2: endp ;出口參數(shù): DX.AX- 32位有符 號(hào)數(shù)的補(bǔ)碼 neg32 proc ;入口參數(shù): DX.AX- 32位有符 號(hào)數(shù) not ax not dx add

32、 ax,1 adc dx,0 ret ;實(shí)現(xiàn)DX.AX求反加1 neg32 endp ;出口參數(shù): DX.AX- 32位有符 號(hào)數(shù)的補(bǔ)碼 3.34 編寫一個(gè)計(jì)算字節(jié)校驗(yàn)的子程序。所謂“校驗(yàn)和”是指不計(jì)進(jìn)位的累加,常用語(yǔ)建廠 信息的正確性。主程序提供入口參數(shù),有數(shù)據(jù)個(gè)數(shù)和數(shù)據(jù)緩沖區(qū)的首地址。子程序回送求 和結(jié)果這個(gè)出口參數(shù)。傳遞參數(shù)方法自定。 解: ; 數(shù)據(jù)段 array count result db 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h; 數(shù)組 equ $-array; 數(shù)組元素個(gè)數(shù) db ?; 校驗(yàn)和 ; 代碼段 mov bx,offset a

33、rray;BX J數(shù)組的偏移地址 mov cx,cou nt;CXj數(shù)組的元素個(gè)數(shù) call checksum ; 調(diào)用求和過(guò)程 mov result,al; 處理出口參數(shù) mov ax,4c00h int 21h ; 計(jì)算字節(jié)校驗(yàn)和的通用過(guò)程 ; 入口參數(shù): DS:BX=數(shù)組的段地址:偏移地址, ; 出口參數(shù): AL=校驗(yàn)和 ; 說(shuō)明:除 AX/BX/CX外,不影響其他寄存器 checksum proc xor al,al ; 累加器清 0 sum: add al,bx ; 求和 inc bx loop sum ret ; 指向下一個(gè)字節(jié) checksum endp end Cadd sp,

34、2 .exit 0 dispa J proc push bp mov bp,sp push ax push cx push dx mov ax,bp+4 mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx pop ax pop bp ret dispa endp dldisp J proc push ax or dl,30h cmp dl,39

35、h jbe dldisp1 add dl,7 dldisp1: mov ah,2 int 21h pop ax ret dldisp endp end 3.36什么情況需要使用 PUBLIC和EXTERN偽指令?請(qǐng)將題 3.20的子程序全部用于寄存器 傳遞參數(shù),寫成子程序模塊。 解: 如果利用共享變量傳遞函數(shù),且變量定義和使用不在同一個(gè)源程序中,需要利用 PUBLIC EXTERN明。 3.37 宏是如何定義、調(diào)用和展開的? 解: (1)宏定義由一對(duì)宏匯編偽指令 MACR和ENDM來(lái)完成,格式如下: 宏名MACRO 形 參表 ;宏定義體 ENDM 宏定義之后就可以使用它,即宏調(diào)用: 宏名 實(shí)參表 ( 2)宏調(diào)用 的格式同一般指令一樣:在使用宏指令的位置寫下宏名,后跟實(shí)體參數(shù); 如果有多個(gè)參數(shù),應(yīng)按形參順序填入實(shí)參,也用逗號(hào)分隔 ( 3)宏展開 :在匯編時(shí),宏指令被匯編程序用對(duì)應(yīng)的代碼序列替代,這就是宏展開 宏展開的具體過(guò)程是: 當(dāng)匯編程序掃描源程序遇到已有定義的宏調(diào)用時(shí), 即用相應(yīng)的宏 定義體完全替代源程序的宏指令,同時(shí)用位置匹配的實(shí)參對(duì)形參進(jìn)行取代 3.38 宏參數(shù)有什么特點(diǎn),宏定義的形參如何與宏調(diào)用的實(shí)參相結(jié)合? 解:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論