匯編語言第二版王爽完整答案.doc
《匯編語言第二版王爽完整答案.doc》由會員分享,可在線閱讀,更多相關(guān)《匯編語言第二版王爽完整答案.doc(54頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第1章 基礎(chǔ)知識 檢測點1.1 (1)1個CPU的尋址能力為8KB,那么它的地址總線的寬度為13。 (2)1KB的存儲器有1024個存儲單元。存儲單元的編號從0到1023。 (3)1KB的存儲器可以存儲1024*8個bit,1024個Byte。 (4)1GB、1MB、1KB分別是2^30、2^20、2^10 Byte。(n^m的意思是n的m次冪) (5)8080、8088、80286、80386的地址總線寬度分別是16根、20根、24根、32根,則它們的尋址能力分別為:64(KB)、1(MB)、16(MB)、4(GB)。 (6)8080、8088、8086、80286、80386的數(shù)據(jù)總線寬度分別為8根、8根、16根、16根、32根。則它們一次可以傳送的數(shù)據(jù)為:1(B)、1(B)、2(B)、2(B)、4(B)。 (7)從內(nèi)存中讀取1024字節(jié)的數(shù)據(jù),8086至少要讀512次、80386至少要讀256次。 (8)在存儲器中,數(shù)據(jù)和程序以二進制形式存放。 第2章 寄存器 答案 檢測點2.1 (1) 寫出每條匯編指令執(zhí)行后相關(guān)寄存器中的值。 mov ax,62627 AX=F4A3H mov ah,31H AX=31A3H mov al,23H AX=3123H add ax,ax AX=6246H mov bx,826CH BX=826CH mov cx,ax CX=6246H mov ax,bx AX=826CH add ax,bx AX=04D8H mov al,bh AX=0482H mov ah,bl AX=6C82H add ah,ah AX=D882H add al,6 AX=D888H add al,al AX=D810H mov ax,cx AX=6246H (2) 只能使用目前學過的匯編指令,最多使用4條指令,編程計算2的4次方。 解: mov ax,2 add ax,ax add ax,ax add ax,ax 檢測點2.2 (1) 給定段地址為0001H,僅通過變化偏移地址尋址,CPU的尋址范圍為00010H到1000FH。 (2) 有一數(shù)據(jù)存放在內(nèi)存 20000H 單元中,先給定段地址為SA,若想用偏移地址尋到此單元。則SA應滿足的條件是:最小為1001H,最大為2000H。 檢測點2.3 下面的3條指令執(zhí)行后,CPU幾次修改IP?都是在什么時候?最后IP中的值是多少? mov ax,bx sub ax,ax jmp ax 解: 修改4次;第一次在CPU讀取“mov ax,bx”后,第二次在CPU讀取“sub ax,ax”后,第三次在CPU讀取“jmp ax”后,第四次在CPU執(zhí)行完“mov ax,bx”后;最后IP中的值為0。 實驗1 查看CPU和內(nèi)存,用機器指令和匯編指令編程 1.略 2. (1)略 (2)略 (3)查看內(nèi)存中的內(nèi)容。 PC機主板上的ROM中寫有一個生產(chǎn)日期,在內(nèi)存FFF00H~FFFFFH的某幾個單元中,請找出這個生產(chǎn)日期并試圖改變它。 解:內(nèi)存FFF00H~FFFFFH為ROM區(qū),內(nèi)容可讀但不可寫。 (4)向內(nèi)存從B8100H開始的單元中填寫數(shù)據(jù),如: -e B810:0000 01 01 02 02 03 03 04 04 請讀者先填寫不同的數(shù)據(jù),觀察產(chǎn)生的現(xiàn)象;在改變填寫的地址,觀察產(chǎn)生的現(xiàn)象。 解:8086的顯存地址空間是A0000H~BFFFFH,其中B8000H~BFFFFH為80*25彩色字符模式顯示緩沖區(qū),當向這個地址空間寫入數(shù)據(jù)時,這些數(shù)據(jù)會立即出現(xiàn)在顯示器上。 第3章 寄存器(內(nèi)存訪問) 檢測點3.1 (1) 在Debug中,用“d 0:0 1f”查看內(nèi)存,結(jié)果如下。 0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60 0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88 下面的程序執(zhí)行前,AX=0,BX=0,寫出每條匯編指令執(zhí)行完后相關(guān)寄存器的值。 mov ax,1 mov ds,ax mov ax,[0000] AX=2662H mov bx,[0001] BX=E626H mov ax,bx AX=E626H mov ax,[0000] AX=2662H mov bx,[0002] BX=D6E6H add ax,bx AX=FD48H add ax,[0004] AX=2C14H mov ax,0 AX=0000H mov al,[0002] AX=00E6H mov bx,0 BX=0000H mov bl,[000C] BX=0026H add al,bl AX=000CH (2)內(nèi)存中的情況如圖3.6所示 各寄存器的初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0; ① 寫出CPU執(zhí)行的指令序列(用匯編指令寫出)。 ② 寫出CPU執(zhí)行每條指令后,CS、IP和相關(guān)寄存器中的數(shù)值。 ③ 再次體會:數(shù)據(jù)和程序有區(qū)別嗎?如何確定內(nèi)存中的信息哪些是數(shù)據(jù),哪些是程序? 解: 初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0 ① ② mov ax,6622H AX=6622H 其他寄存器保持不變,以下同理 jmp 0ff0:0100 CS=0ff0H,IP=0100H mov ax,2000H AX=2000H mov ds,ax DS=20000H mov ax,[0008] AX=C389H mov ax,[0002] AX=EA66H ③ 沒有區(qū)別,被CS:IP指向的信息是程序;被傳送、運算等指令操作的是數(shù)據(jù)。 檢測點3.2 (1) 補全下面的程序,使其可以將10000H~1000FH中的8個字,逆序復制到200000H~2000FH中。逆序復制的含義如圖3.17所示(圖中內(nèi)存里的數(shù)據(jù)均為假設(shè))。 mov ax,1000H mov ds,ax mov ax,2000H mov ss,ax mov sp,10H push [0] push [2] push [4] push [6] push [8] push [A] push [C] push [E] (2) 補全下面的程序,使其可以將100000H~1000FH中的8個字,逆序復制到200000H~2000FH中。 mov ax,2000H mov ds,ax mov ax,1000H mov ss,ax mov sp,0 pop [E] pop [C] pop [A] pop [8] pop [6] pop [4] pop [2] pop [0] 實驗2 用機器指令和匯編指令編程 1.預備知識:Debug的使用 略 2.實驗任務 (1) 使用Debug,將上面的程序段寫入內(nèi)存,逐條執(zhí)行,根據(jù)指令執(zhí)行后的實際運行情況填空。 mov ax,ffff mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;ax=58EA add ax,[2] ;ax=5CCA mov bx,[4] ;bx=30F0 add bx,[6] ;bx=6021 push ax ;sp=00FE;修改的內(nèi)存單元的地址是220FE,內(nèi)容為5CCA push bx ;sp=00FC;修改的內(nèi)存單元的地址是220FC,內(nèi)容為6021 pop ax ;sp=00FE;ax=6021 pop bx ;sp=0100;bx=5CCA push [4] ;sp=00FE;修改的內(nèi)存單元的地址是220FE,內(nèi)容為30F0 push [6] ;sp=00FC;修改的內(nèi)存單元的地址是220FC,內(nèi)容為2F31 注:內(nèi)存中的數(shù)據(jù)會因機器、環(huán)境而異 (2) 仔細觀察圖3.19中的實驗過程,然后分析:為什么2000:0~2000:f中的內(nèi)容會發(fā)生改變? 解:t命令為單步中斷,CPU會保護現(xiàn)場,即順序把標志寄存器、CS、IP入棧,此題是關(guān)于后面章節(jié)的中斷問題。 第4章 第一個程序 實驗3 編程、編譯、連接、跟蹤 (1) 將下面的程序保存為t1.asm,將其生成可執(zhí)行文件ti.exe。 assume cs:codesg codesg segment mov ax,2000h mov ss,ax mov sp,0 add sp,10 pop ax pop bx push ax push bx pop ax pop bx mov ax,4c00h int 21h codesg ends end 解:略 (2) 用Debug跟蹤t1.exe的執(zhí)行過程,寫出每一步執(zhí)行后,相關(guān)寄存器中的內(nèi)容和棧頂?shù)膬?nèi)容。 解: (3)PSP的頭兩個字節(jié)是CD20,用Debug加載ti.exe,查看PSP的內(nèi)容。 解: 第5章 [BX]和loop指令 實驗4 [bx]和loop的使用 (1)編程,向內(nèi)存0:200~0:23F依次傳送數(shù)據(jù)0~63(3FH)。 解: assume cs:codesg codesg segment mov ax,0 mov ds,ax mov bx,200H mov al,0 mov cx,64 s:mov [bx],al inc bx inc al loop s mov ax,4c00h int 21h codesg ends end (2)編程,向內(nèi)存0:200~0:23F依次傳送數(shù)據(jù)0~63(3FH),程序中只能使用9條指令,9條指令中包括“mov ax,4c00h”和“int 21h”。 解: assume cs:codesg codesg segment mov ax,20h mov ds,ax mov bx,0 mov cx,64 s:mov [bx],bl inc bx loop s mov ax,4c00h int 21h codesg ends end (3) 下面的程序的功能是將“mov ax,4c00h”之前的指令復制到內(nèi)存0:200處,補全程序。上機調(diào)試,跟蹤運行結(jié)果。 assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,17h s:mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end 第6章 包含多個段的程序 檢測點6.1 (1) 下面的程序?qū)崿F(xiàn)依次用內(nèi)存0:0~0:15單元中的內(nèi)容改寫程序中的數(shù)據(jù),完成程序: assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h start: mov ax,0 mov ds,ax mov bx,0 mov cx,8 s: mov ax,[bx] mov cs:[bx],ax add bx,2 loop s mov ax,4c00h int 21h codesg ends end start (2) 下面的程序?qū)崿F(xiàn)依次用內(nèi)存0:0~0:15單元中的內(nèi)容改寫程序中的數(shù)據(jù),數(shù)據(jù)的傳送用棧來進行。??臻g設(shè)置在程序內(nèi)。完成程序: assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h dw 0,0,0,0,0,0,0,0,0,0 ;10個字單元用??臻g start: mov ax,cs mov ss,ax mov sp,36 mov ax,0 mov ds,ax mov bx,0 mov cx,8 s: push [bx] pop cs:[bx] add bx,2 loop s mov ax,4c00h int 21h codesg ends end start 實驗5 編寫、調(diào)試具有多個段的程序 (1) 將下面的程序編譯連接,用Debug加載、跟蹤,然后回答問題 assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start ① CPU執(zhí)行程序,程序返回前,data段中的數(shù)據(jù)為多少? 解:不變 ② CPU執(zhí)行程序,程序返回前,cs=155ch、ss=155bh、ds=155ah。 (此題結(jié)果因環(huán)境而異,但相對差值不變) ③ 設(shè)程序加載后,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。 (2) 將下面的程序編譯連接,用Debug加載、跟蹤,然后回答問題 assume cs:code,ds:data,ss:stack data segment dw 0123H,0456H data ends stack segment dw 0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start ① CPU執(zhí)行程序,程序返回前,data段中的數(shù)據(jù)為多少? 解:不變 ② CPU執(zhí)行程序,程序返回前,cs=155ch、ss=155bh、ds=155ah。 (此題結(jié)果因環(huán)境而異,但相對差值不變) ③ 設(shè)程序加載后,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。 ④對于如下定義的段: name segment … name ends 如果段中的數(shù)據(jù)占N個字節(jié),則程序加載后,這段實際占有的空間為(N/16+1)*16. (N/16為取整數(shù)部分) (3) 將下面的程序編譯連接,用Debug加載、跟蹤,然后回答問題 assume cs:code,ds:data,ss:stack code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123H,0456H data ends stack segment dw 0,0 stack ends end start ① CPU執(zhí)行程序,程序返回前,data段中的數(shù)據(jù)為多少? 解:不變 ② CPU執(zhí)行程序,程序返回前,cs=155ah、ss=155eh、ds=155dh。 (此題結(jié)果因環(huán)境而異,但相對差值不變) ③ 設(shè)程序加載后,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4。 (4) 如果將(1)、(2)、(3)題中的最后一條偽指令“end start”改為“end”(也就是說不指明程序的入口),則那個程序仍然可以正確執(zhí)行?請說明原因。 解:(1)、(2)不能正確執(zhí)行(入口默認為data段的第一條指令),(3)能正確執(zhí)行。如果不指明程序的入口,編譯器自動默認整個代碼的第一條指令為程序的入口。 (經(jīng) qingxh1 指正,在此鳴謝) (5) 程序如下,編寫code段中的內(nèi)容,將a段和b段中的數(shù)據(jù)依次相加,將結(jié)果存到c段中。 assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 0,0,0,0,0,0,0,0 c ends code segment start: mov ax,a mov ds,ax mov bx,0 mov cx,8 s: mov al,ds:[bx] add al,ds:[bx+16] mov ds:[bx+32],al inc bx loop s mov ax,4c00h int 21h code ends end start (6) 程序如下,編寫code段中的代碼,用push指令將a段中的前8個字型數(shù)據(jù),逆序存儲到b段中。 assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 0,0,0,0,0,0,0,0 b ends code segment start: mov ax,a mov ds,ax mov bx,0 mov ax,b mov ss,ax mov sp,16 mov cx,8 s: push [bx] inc bx inc bx loop s mov ax,4c00h int 21h code ends end start 第7章 更靈活的定位內(nèi)存地址的方法 實驗6 實踐課程中的程序 (1)略 (2) 編程,完成問題7.9中的程序。 編程,將datasg段中每個單詞的前4個字母改寫為大寫字母。 assume cs:codesg,ss:stacksg,ds:datasg stacksg segment dw 0,0,0,0,0,0,0,0 stacksg ends datasg segment db 1. display db 2. brows db 3. replace db 4. modify datasg ends codesg segment start: mov ax,stacksg mov ss,ax mov sp,16 mov ax,datasg mov ds,ax mov bx,0 mov cx,4 s0: push cx mov si,0 mov cx,4 s: mov al,[bx+si+3] and al,11011111b mov [bx+si+3],al inc si loop s add bx,16 pop cx loop s0 mov ax,4c00h int 21h codesg ends end start 第8章 數(shù)據(jù)處理的兩個基本問題 實驗7 尋址方式在結(jié)構(gòu)化數(shù)據(jù)訪問中的應用 編程,將data段中的數(shù)據(jù)按如下格式寫入到table段中,并計算21年中的人均收入(取整),結(jié)果也按照下面的格式保存在table段中。 解: assume cs:codesg,ds:data,es:table data segment db 1975,1976,1977,1978,1979,1980,1981,1982,1983 db 1984,1985,1986,1987,1988,1989,1990,1991,1992 db 1993,1994,1995 ;以上是表示21年的21個字符串 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司總收的21個dword型數(shù)據(jù) dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,45257,17800 ;以上是表示21年公司雇員人數(shù)的21個word型數(shù)據(jù) data ends table segment db 21 dup(year summ ne ?? ) table ends codesg segment start: mov ax,data mov ds,ax mov si,0 mov ax,table mov es,ax mov di,0 mov cx,21 s: mov ax,ds:[si] ;年份轉(zhuǎn)送 mov es:[di],ax mov ax,ds:[si+2] mov es:[di+2],ax mov ax,ds:[si+84] ;收入轉(zhuǎn)送 mov es:[di+5],ax mov dx,ds:[si+84+2] mov es:[di+7],dx push cx ;保護cx mov cx,ds:[84+84+bx] ;雇員數(shù)轉(zhuǎn)送 mov es:[di+0ah],cx div cx ;計算人均收入 pop cx mov es:[di+0dh],ax ;人均收入轉(zhuǎn)送 add si,4 add bx,2 add di,16 loop s mov ax,4c00h int 21h codesg ends end start 第9章 轉(zhuǎn)移指令的原理 檢測點9.1 (1) 程序如下。 assume cs:code data segment db 0,0,0 data ends code segment start: mov ax,data mov ds,ax mov bx,0 jmp word ptr [bx+1] code ends end start 若要使程序中的jmp指令執(zhí)行后,CS:IP指向程序的第一條指令,在data段中應該定義哪些數(shù)據(jù)? (2) 程序如下。 assume cs:code,ds:data data segment dd 12345678h data ends code segment start: mov ax,data mov ds,ax mov bx,0 mov [bx],bx mov [bx+2],cs jmp dword ptr ds:[0] code ends end start 補全程序,使jmp指令執(zhí)行后,CS:IP指向程序的第一條指令。 (3)用Debug查看內(nèi)存,結(jié)果如下: 2000:1000 BE 00 06 00 00 00 ...... 則此時,CPU執(zhí)行指令: mov ax,2000H mov es,ax jmp dword ptr es:[1000H] 后,(CS)=? , (IP)=? 解:CS=0006H,IP=00BEH 檢測點9.2 補全編程,利用jcxz指令,實現(xiàn)在內(nèi)存2000H段中找查第一個值為為0的字節(jié),找到后,將它的偏移地址存儲在dx中。 assume cs:code code segment start: mov ax,2000H mov ds,ax mov bx,0 s: mov ch,0 mov cl,[bx] jcxz ok inc bx jmp short s ok: mov dx,bx mov ax,4c00h int 21h code ends end start 檢測點9.3 補全程序,利用loop指令,實現(xiàn)在內(nèi)存2000H段中查找第一個值為0的字節(jié),找到后,將它的偏移地址存儲在dx中。 assume cs:code code segment start: mov ax,2000h mov ds,ax mov bx,0 s: mov cl,[bx] mov ch,0 inc cx inc bx loop s ok: dec bx mov dx,bx mov ax,4c00h int 21h code ends end start 實驗8 分析一個奇怪的程序 分析下面的程序,在運行前思考:這個程序可以正確返回嗎? 運行后再思考:為什么是這種結(jié)果? 通過這個程序加深對相關(guān)內(nèi)容的理解。 assume cs:codesg codesg segment mov ax,4c00h int 21h start: mov ax,0 s: nop nop mov di,offset s mov si,offset s2 mov ax,cs:[si] mov cs:[di],ax s0: jmp short s s1: mov ax,0 int 21h mov ax,0 s2: jmp short s1 nop codesg ends end start 解:可以正常返回,jmp short s1的機器碼是EBF6,即使當前的IP=IP-10,將這條指令移動到s:處后,jmp short s1不會指到s1了,而是指到相對當前位置(jmp short s1的下一條指令)的-10的位置(mov ax,4c00h),所以這個程序可以正常返回。 實驗9 根據(jù)材料編程 編程:在屏幕中間分別顯示綠色、綠底紅色、白底藍色的字符串welcome to masm!。 解: assume cs:code data segment db welcome to masm! data ends code segment start: mov ax,data mov ds,ax mov ax,0b800h mov es,ax mov si,0 mov di,10*160+80 ;第十行中間 mov cx,16 s1: mov al,ds:[si] mov ah,00000010B ;綠色 mov es:[di],ax inc si inc di inc di loop s1 mov si,0 mov di,11*160+80 ;第十一行中間 mov cx,16 s2: mov al,ds:[si] mov ah,00100100B ;綠底紅色 mov es:[di],ax inc si inc di inc di loop s2 mov si,0 mov di,12*160+80 ;第十二行中間 mov cx,16 s3: mov al,ds:[si] mov ah,01110001B ;白底藍色 mov es:[di],ax inc si inc di inc di loop s3 mov ax,4c00h int 21h ;如果要看到完整的顯示請輸入:“-g 4c”,即立即運行到此條指令 code ends end start 注:此程序如果利用后面所學知識,可以將三次顯示嵌套簡化為一次。 第10章 CALL和RET指令 檢測點10.1 補全程序,實現(xiàn)從內(nèi)存1000:0000處開始執(zhí)行指令。 assume cs:code stack segment db 16 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,1000h push ax mov ax,0 push ax retf code ends end start 檢測點10.2 下面的程序執(zhí)行后,ax中的數(shù)值為多少? 內(nèi)存地址 機器碼 匯編指令 1000:0 b8 00 00 mov ax,0 1000:3 e8 01 00 call s 1000:6 40 inc ax 1000:7 58 s:pop ax 解:ax=6 檢測點10.3 下面的程序執(zhí)行后,ax中的數(shù)值為多少? 內(nèi)存地址 機器碼 匯編指令 1000:0 b8 00 00 mov ax,0 1000:3 9a 09 00 00 10 call far ptr s 1000:8 40 inc ax 1000:9 58 s:pop ax add ax,ax pop bx add ax,bx 解:ax=1010h 檢測點10.4 下面的程序執(zhí)行后,ax中的數(shù)值為多少? 內(nèi)存地址 機器碼 匯編指令 1000:0 b8 06 00 mov ax,6 1000:2 ff d0 call ax 1000:5 40 inc ax 1000:6 mov bp,sp add ax,[bp] 解:ax=11 檢測點10.5 (1)下面的程序執(zhí)行后,ax中的數(shù)值為多少? 注:不能用單步中斷測試程序,中斷涉及堆棧操作,不能帶便CPU的真實執(zhí)行結(jié)果。 assume cs:code stack segment dw 8 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ds,ax mov ax,0 call word ptr ds:[0EH] inc ax inc ax inc ax mov ax,4c00h int 21h code ends end start 解:ax=3 (2)下面的程序執(zhí)行后,ax中的數(shù)值為多少? assume cs:code stack segment dw 8 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov word ptr ss:[0],offset s mov ss:[2],cs call dword ptr ss:[0] nop s: mov ax,offset s sub ax,ss:[0cH] mov bx,cs sub bx,ss:[0eH] mov ax,4c00h int 21h code ends end start 解:ax=1,bx=0 實驗10 編寫子程序 1.顯示字符串 ;名稱:show_str ;功能:在屏幕的指定位置,用指定顏色,顯示一個用0結(jié)尾的字符串 ;參數(shù):(dh)=行號,(dl)=列號(取值范圍0~80),(cl)=顏色,ds:si:該字符串的首地址 ;返回:顯示在屏幕上 assume cs:daima shuju segment db fghfghf,0 shuju ends daima segment kaishi: mov dh,8 mov dl,21 mov cl,2 mov ax,shuju mov ds,ax mov si,0 call show_str mov ax,4c00h int 21h ;---------------------------- show_str: push ax push cx push dx push es push si push di mov ax,0b800h mov es,ax dec dh mov al,160 mul dh add dl,dl mov dh,0 ;計算顯示在屏幕位置 add ax,dx mov di,ax mov ah,cl x: mov cl,ds:[si] mov ch,0 jcxz f mov al,cl mov es:[di],ax inc si inc di inc di jmp x f: pop di pop si pop es pop dx pop cx pop ax ret ;------------------------ daima ends end kaishi 2.解決除法溢出問題 ;名稱:divdw ;功能:除法,被除數(shù)32位,除數(shù)16位,商32位,余數(shù)16位,不會溢出 ;參數(shù):(dx)=被除數(shù)高16位,(ax)=被除數(shù)低16位,(cx)=除數(shù) ;返回:(dx)=商高16位,(ax)=商低16位,(cx)=余數(shù) assume cs:daima daima segment kaishi: mov ax,2390 mov dx,0 mov cx,10 call divdw mov ax,4c00h int 21h ;----------------------------- divdw: push bx push ax mov ax,dx mov dx,0 div cx mov bx,ax pop ax div cx mov cx,dx mov dx,bx pop bx ret ;-------------------------------- daima ends end kaishi 3.數(shù)值顯示 ;名稱:dtoc_word ;功能:將一個word型數(shù)轉(zhuǎn)化為字符串 ;參數(shù):(ax)=word型的數(shù)據(jù),ds:si指向字符串的首地址 ;返回:ds:[si]放此字符串,以0結(jié)尾 assume cs:daima shuju segment db 20 dup(1) shuju ends daima segment kaishi: mov ax,shuju mov ds,ax mov ax,10100 call dtoc_word mov ax,4c00h int 21h ;------------------------------ dtoc_word: push ax push bx push cx push dx push si mov bx,0 x: mov dx,0 mov cx,10 div cx mov cx,ax add dx,0 push dx inc bx jcxz f jmp x f: mov cx,bx x1: pop ds:[si] inc si loop x1 pop si pop dx pop cx pop bx pop ax ret ;---------------------------- daima ends end kaishi 課程設(shè)計 1 任務:將實驗7中的Power idea公司的數(shù)據(jù)按照圖10.所示的格式在屏幕上顯示出來。 解: ;注:函數(shù)中的標號為防止沖突,都加了本函數(shù)名為前綴 ;在Debug中輸入“-g 90”,直接運行到結(jié)束 assume cs:code data segment db 1975,1976,1977,1978,1979,1980,1981,1982,1983 db 1984,1985,1986,1987,1988,1989,1990,1991,1992 db 1993,1994,1995 ;以上是表示21年的21個字符串 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司總收的21個dword型數(shù)據(jù) dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,45257,17800 ;以上是表示21年公司雇員人數(shù)的21個word型數(shù)據(jù) data ends agency segment db 8 dup(0) agency ends code segment start: mov ax,0b800h mov es,ax mov di,0 mov cx,80*24 x: mov byte ptr es:[di], ;將屏幕清空 mov byte ptr es:[di+1],0 inc di inc di loop x mov ax,data mov es,ax mov di,0 mov bx,0 mov ax,agency mov ds,ax mov si,0 mov dh,4 mov cx,21 x1: push cx mov ax,es:[di] mov ds:[si],ax mov ax,es:[di+2] mov ds:[si+2],ax mov byte ptr ds:[si+4],0 ;顯示年份 mov dl,0 mov cl,2 call show_str mov ax,es:[84+di] push dx mov dx,es:[84+di+2] call dtoc_dword ;顯示收入 pop dx mov dl,20 mov cl,2 call show_str mov ax,es:[84+84+bx] call dtoc_word mov dl,40 ;顯示雇員數(shù) mov cl,2 call show_str mov ax,es:[84+di] push dx mov dx,es:[84+di+2] div word ptr es:[84+84+bx] ;計算人均收入并顯示 call dtoc_word pop dx mov dl,60 mov cl,2 call show_str add di,4 add bx,2 add dh,1 pop cx loop x1 mov ax,4c00h int 21h ;名稱:show_str ;功能:在屏幕的指定位置,用指定顏色,顯示一個用0結(jié)尾的字符串 ;參數(shù):(dh)=行號,(dl)=列號(取值范圍0~80),(cl)=顏色,ds:si:該字符串的首地址 ;返回:顯示在屏幕上 show_str: push ax push cx push dx push es push si push di mov ax,0b800h mov es,ax mov al,160 mul dh add dl,dl mov dh,0 add ax,dx mov di,ax mov ah,cl show_str_x: mov cl,ds:[si] mov ch,0 jcxz show_str_f mov al,cl mov es:[di],ax inc si inc di inc di jmp show_str_x show_str_f: pop di pop si pop es pop dx pop cx pop ax ret ;名稱:dtoc_word ;功能:將一個word型數(shù)轉(zhuǎn)化為字符串 ;參數(shù):(ax)=word型的數(shù)據(jù),ds:si指向字符串的首地址 ;返回:ds:[si]放此字符串,以0結(jié)尾 dtoc_word: push ax push bx push cx push dx push si mov bx,0 dtoc_word_x: mov dx,0 mov cx,10 div cx mov cx,ax add dx,0 push dx inc bx jcxz dtoc_word_f jmp dtoc_word_x dtoc_word_f: mov cx,bx dtoc_word_x1: pop ds:[si] inc si loop dtoc_word_x1 pop si pop dx pop cx pop bx pop ax ret ;名稱:dtoc_dword ;功能:將一個double word型數(shù)轉(zhuǎn)化為字符串 ;參數(shù):(dx)=數(shù)的高八位,(ax)=數(shù)的低八位 ;返回:ds:[si]放此字符串,以0結(jié)尾 ;備注:會用到divdw函數(shù) dtoc_dword: push ax push bx push cx push dx push si mov bx,0 dtoc_dword_x: mov cx,10 call divdw push cx inc bx cmp ax,0 jne dtoc_dword_x cmp dx,0 jne dtoc_dword_x mov cx,bx dtoc_dword_x1: pop ds:[si] add byte ptr ds:[si],0 inc si loop dtoc_dword_x1 pop si pop dx pop cx pop bx pop ax ret ;名稱:divdw ;功能:除法,被除數(shù)32位,除數(shù)16位,商32位,余數(shù)16位,不會溢出 ;參數(shù):(dx)=被除數(shù)高16位,(ax)=被除數(shù)低16位,(cx)=除數(shù) ;返回:(dx)=商高16位,(ax)=商低16位,(cx)=余數(shù) divdw: push bx push ax mov ax,dx mov dx,0 div cx mov bx,ax pop ax div cx mov cx,dx mov dx,bx pop bx ret code ends end start 第11章 標志寄存器 檢測點11.1 寫出下面每條指令后,ZF、PF、SF等標志位的值。 ZF PF SF sub al,al 1 1 0 mov al,1 1 1 0 push ax 1 1 0 pop bx 1 1 0 add al,bl 0 0 0 add al,10 0 1 0 mul al 0 1 0 檢測點11.2 CF OF SF ZF PF sub al,al 0 0 0 1 1 mov al,10H 0 0 0 1 1 add al,90H 0 0 1 0 1 mov al,80H 0 0 1 0 1 add al,80H 1 1 0 1 1 mov al,0FCH 1 1 0 1 1 add al,05H 1 0 0 0 0 mov al,7DH 1 0 0 0 0 add al,0BH 0 1 1 0 1 檢測點11.3 (1) 補全下面的程序,統(tǒng)計F000:0處32個字節(jié)中,大小在[32,128]的數(shù)據(jù)的個數(shù)。 mov ax,0f000h mov ds,ax mov bx,0 mov dx,0 mov cx,32 s:mov al,[bx] cmp al,32 jb s0 cmp al,120 ja s0 inc dx s0:inc bx loop s (2) 補全下面的程序,統(tǒng)計F000:0處32個字節(jié)中,大小在(32,128)的數(shù)據(jù)的個數(shù)。 mov ax,0f000h mov ds,ax mov bx,0 mov dx,0 mov cx,32 s:mov al,[bx] cmp al,32 jna s0 cmp al,120 jnb s0 inc dx s0:inc bx loop s 檢測點11.4 下面的程序執(zhí)行后:(ax)=? mov ax,0 push ax popf mov ax,0fff0h add ax,0010h pushf pop ax and al,11000101B and ah,00001000B 解:(ax)=01000101B 實驗11 編寫子程序 ;名稱:letterc ;功能:將以0結(jié)尾的字符串中的小寫字母轉(zhuǎn)變成大寫字母 ;參數(shù):ds:si開始存放的字符串 ;返回:ds:si開始存放的字符串 assume cs:codesg datasg segment db "Beginners All-purpose Symbolic Instruction Code.",0 datasg ends codesg segment begin: mov ax,datasg mov ds,ax mov si,0 call letterc mov ax,4c00h int 21h letterc: push si push ax x: mov al,ds:[si] cmp al,0 je f inc si cmp al,a jb x cmp al,z ja x add al,A-a mov ds:[si-1],al jmp x f: pop ax pop si ret codesg ends end begin 第12章 內(nèi)中斷 檢測點12.1 (1) 用Debug查看內(nèi)存,情況如下: 0000:0000 68 10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00 則3號中斷源對應的中斷處理程序的入口地址為:0070:018B 。 (2) 存儲N號中斷源對應的中斷處理程序入口的偏移地址的內(nèi)存單元的地址為:4N 。 存儲N號中斷源對應的中斷處理程序入口的段地址的內(nèi)存單元的地址為:4N+2 。 實驗12 編寫0號中斷的處理程序 編寫0號中斷的處理程序,使得在除法溢出發(fā)生時,在屏幕中間顯示字符串“divide error!”,然后返回到DOS。 解: assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset- 1.請仔細閱讀文檔,確保文檔完整性,對于不預覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 匯編語言 第二 版王爽 完整 答案
鏈接地址:http://www.hcyjhs8.com/p-6591353.html