




已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第1章 基礎(chǔ)知識檢測點(diǎn)1.1(1)1個CPU的尋址能力為8KB,那么它的地址總線的寬度為13。(2)1KB的存儲器有1024個存儲單元。存儲單元的編號從0到1023。(3)1KB的存儲器可以存儲1024*8個bit,1024個Byte。(4)1GB、1MB、1KB分別是230、220、210 Byte。(nm的意思是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ù)和程序以二進(jìn)制形式存放。第2章 寄存器 答案檢測點(diǎn)2.1(1) 寫出每條匯編指令執(zhí)行后相關(guān)寄存器中的值。mov ax,62627 AX=F4A3Hmov ah,31H AX=31A3Hmov al,23H AX=3123Hadd ax,ax AX=6246Hmov bx,826CH BX=826CHmov cx,ax CX=6246Hmov ax,bx AX=826CHadd ax,bx AX=04D8Hmov al,bh AX=0482Hmov ah,bl AX=6C82Hadd ah,ah AX=D882Hadd al,6 AX=D888Hadd al,al AX=D810Hmov ax,cx AX=6246H(2) 只能使用目前學(xué)過的匯編指令,最多使用4條指令,編程計算2的4次方。解:mov ax,2add ax,axadd ax,axadd ax,ax檢測點(diǎn)2.2(1) 給定段地址為0001H,僅通過變化偏移地址尋址,CPU的尋址范圍為00010H到1000FH。(2) 有一數(shù)據(jù)存放在內(nèi)存 20000H 單元中,先給定段地址為SA,若想用偏移地址尋到此單元。則SA應(yīng)滿足的條件是:最小為1001H,最大為2000H。檢測點(diǎn)2.3下面的3條指令執(zhí)行后,CPU幾次修改IP?都是在什么時候?最后IP中的值是多少?mov ax,bxsub ax,axjmp ax解:修改4次;第一次在CPU讀取“mov ax,bx”后,第二次在CPU讀取“sub ax,ax”后,第三次在CPU讀取“jmp ax”后,第四次在CPU執(zhí)行完“mov ax,bx”后;最后IP中的值為0。實(shí)驗1 查看CPU和內(nèi)存,用機(jī)器指令和匯編指令編程1.略2.(1)略(2)略(3)查看內(nèi)存中的內(nèi)容。PC機(jī)主板上的ROM中寫有一個生產(chǎn)日期,在內(nèi)存FFF00HFFFFFH的某幾個單元中,請找出這個生產(chǎn)日期并試圖改變它。解:內(nèi)存FFF00HFFFFFH為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的顯存地址空間是A0000HBFFFFH,其中B8000HBFFFFH為80*25彩色字符模式顯示緩沖區(qū),當(dāng)向這個地址空間寫入數(shù)據(jù)時,這些數(shù)據(jù)會立即出現(xiàn)在顯示器上。第3章 寄存器(內(nèi)存訪問)檢測點(diǎn)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 600000: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,1mov ds,axmov ax,0000 AX=2662Hmov bx,0001 BX=E626Hmov ax,bx AX=E626Hmov ax,0000 AX=2662Hmov bx,0002 BX=D6E6Hadd ax,bx AX=FD48Hadd ax,0004 AX=2C14Hmov ax,0 AX=0000Hmov al,0002 AX=00E6Hmov bx,0 BX=0000Hmov bl,000C BX=0026Hadd 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=0100Hmov ax,2000H AX=2000Hmov ds,ax DS=20000Hmov ax,0008 AX=C389Hmov ax,0002 AX=EA66H 沒有區(qū)別,被CS:IP指向的信息是程序;被傳送、運(yùn)算等指令操作的是數(shù)據(jù)。檢測點(diǎn)3.2(1) 補(bǔ)全下面的程序,使其可以將10000H1000FH中的8個字,逆序復(fù)制到H2000FH中。逆序復(fù)制的含義如圖3.17所示(圖中內(nèi)存里的數(shù)據(jù)均為假設(shè))。mov ax,1000Hmov ds,axmov ax,2000Hmov ss,axmov sp,10Hpush 0push 2push 4push 6push 8push Apush Cpush E(2) 補(bǔ)全下面的程序,使其可以將H1000FH中的8個字,逆序復(fù)制到H2000FH中。mov ax,2000Hmov ds,axmov ax,1000Hmov ss,axmov sp,0pop Epop Cpop Apop 8pop 6pop 4pop 2pop 0實(shí)驗2 用機(jī)器指令和匯編指令編程1.預(yù)備知識:Debug的使用略2.實(shí)驗任務(wù)(1) 使用Debug,將上面的程序段寫入內(nèi)存,逐條執(zhí)行,根據(jù)指令執(zhí)行后的實(shí)際運(yùn)行情況填空。mov ax,ffffmov ds,axmov ax,2200mov ss,axmov sp,0100mov ax,0 ;ax=58EAadd ax,2 ;ax=5CCAmov bx,4 ;bx=30F0add bx,6 ;bx=6021push ax ;sp=00FE;修改的內(nèi)存單元的地址是220FE,內(nèi)容為5CCApush bx ;sp=00FC;修改的內(nèi)存單元的地址是220FC,內(nèi)容為6021pop ax ;sp=00FE;ax=6021pop bx ;sp=0100;bx=5CCApush 4 ;sp=00FE;修改的內(nèi)存單元的地址是220FE,內(nèi)容為30F0push 6 ;sp=00FC;修改的內(nèi)存單元的地址是220FC,內(nèi)容為2F31注:內(nèi)存中的數(shù)據(jù)會因機(jī)器、環(huán)境而異(2) 仔細(xì)觀察圖3.19中的實(shí)驗過程,然后分析:為什么2000:02000:f中的內(nèi)容會發(fā)生改變?解:t命令為單步中斷,CPU會保護(hù)現(xiàn)場,即順序把標(biāo)志寄存器、CS、IP入棧,此題是關(guān)于后面章節(jié)的中斷問題。第4章 第一個程序?qū)嶒? 編程、編譯、連接、跟蹤(1) 將下面的程序保存為t1.asm,將其生成可執(zhí)行文件ti.exe。assume cs:codesgcodesg segmentmov ax,2000hmov ss,axmov sp,0add sp,10pop axpop bxpush axpush bxpop axpop bxmov ax,4c00hint 21hcodesg endsend解:略(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指令實(shí)驗4 bx和loop的使用(1)編程,向內(nèi)存0:2000:23F依次傳送數(shù)據(jù)063(3FH)。解:assume cs:codesgcodesg segmentmov ax,0mov ds,axmov bx,200Hmov al,0mov cx,64s:mov bx,alinc bxinc alloop smov ax,4c00hint 21hcodesg endsend(2)編程,向內(nèi)存0:2000:23F依次傳送數(shù)據(jù)063(3FH),程序中只能使用9條指令,9條指令中包括“mov ax,4c00h”和“int 21h”。解:assume cs:codesgcodesg segmentmov ax,20hmov ds,axmov bx,0mov cx,64s:mov bx,blinc bxloop smov ax,4c00hint 21hcodesg endsend(3) 下面的程序的功能是將“mov ax,4c00h”之前的指令復(fù)制到內(nèi)存0:200處,補(bǔ)全程序。上機(jī)調(diào)試,跟蹤運(yùn)行結(jié)果。assume cs:codecode segmentmov ax,csmov ds,axmov ax,0020hmov es,axmov bx,0mov cx,17hs:mov al,bxmov es:bx,alinc bxloop smov ax,4c00hint 21hcode endsend第6章 包含多個段的程序檢測點(diǎn)6.1(1) 下面的程序?qū)崿F(xiàn)依次用內(nèi)存0:00:15單元中的內(nèi)容改寫程序中的數(shù)據(jù),完成程序:assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hstart: mov ax,0mov ds,axmov bx,0mov cx,8s: mov ax,bxmov cs:bx,axadd bx,2loop smov ax,4c00hint 21hcodesg endsend start(2) 下面的程序?qū)崿F(xiàn)依次用內(nèi)存0:00:15單元中的內(nèi)容改寫程序中的數(shù)據(jù),數(shù)據(jù)的傳送用棧來進(jìn)行。棧空間設(shè)置在程序內(nèi)。完成程序:assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0,0,0,0,0,0,0 ;10個字單元用棧空間start:mov ax,cs mov ss,axmov sp,36 mov ax,0mov ds,axmov bx,0mov cx,8s:push bxpop cs:bxadd bx,2loop smov ax,4c00hint 21hcodesg endsend start實(shí)驗5 編寫、調(diào)試具有多個段的程序(1) 將下面的程序編譯連接,用Debug加載、跟蹤,然后回答問題assume cs:code,ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdata endsstack segmentdw 0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax,datamov ds,axpush ds:0push ds:2pop ds:2pop ds:0mov ax,4c00hint 21hcode endsend 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:stackdata segmentdw 0123H,0456Hdata endsstack segmentdw 0,0stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax,datamov ds,axpush ds:0push ds:2pop ds:2pop ds:0mov ax,4c00hint 21hcode endsend 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 segmentname ends如果段中的數(shù)據(jù)占N個字節(jié),則程序加載后,這段實(shí)際占有的空間為(N/16+1)*16. (N/16為取整數(shù)部分)(3) 將下面的程序編譯連接,用Debug加載、跟蹤,然后回答問題assume cs:code,ds:data,ss:stackcode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax,datamov ds,axpush ds:0push ds:2pop ds:2pop ds:0mov ax,4c00hint 21hcode endsdata segmentdw 0123H,0456Hdata endsstack segmentdw 0,0stack endsend 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í)行(入口默認(rèn)為data段的第一條指令),(3)能正確執(zhí)行。如果不指明程序的入口,編譯器自動默認(rèn)整個代碼的第一條指令為程序的入口。(經(jīng) qingxh1 指正,在此鳴謝)(5) 程序如下,編寫code段中的內(nèi)容,將a段和b段中的數(shù)據(jù)依次相加,將結(jié)果存到c段中。assume cs:codea segmentdb 1,2,3,4,5,6,7,8a endsb segmentdb 1,2,3,4,5,6,7,8b endsc segmentdb 0,0,0,0,0,0,0,0c endscode segmentstart:mov ax,amov ds,axmov bx,0mov cx,8s:mov al,ds:bxadd al,ds:bx+16mov ds:bx+32,alinc bxloop smov ax,4c00hint 21hcode endsend start(6) 程序如下,編寫code段中的代碼,用push指令將a段中的前8個字型數(shù)據(jù),逆序存儲到b段中。assume cs:codea segmentdw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffha endsb segmentdw 0,0,0,0,0,0,0,0b endscode segmentstart:mov ax,amov ds,axmov bx,0mov ax,bmov ss,axmov sp,16mov cx,8s:push bxinc bxinc bxloop smov ax,4c00hint 21hcode endsend start第7章 更靈活的定位內(nèi)存地址的方法實(shí)驗6 實(shí)踐課程中的程序(1)略(2) 編程,完成問題7.9中的程序。編程,將datasg段中每個單詞的前4個字母改寫為大寫字母。assume cs:codesg,ss:stacksg,ds:datasgstacksg segmentdw 0,0,0,0,0,0,0,0stacksg endsdatasg segmentdb 1. display db 2. brows db 3. replace db 4. modify datasg endscodesg segmentstart:mov ax,stacksgmov ss,axmov sp,16mov ax,datasgmov ds,axmov bx,0mov cx,4s0:push cxmov si,0mov cx,4s:mov al,bx+si+3and al,bmov bx+si+3,alinc siloop sadd bx,16pop cxloop s0mov ax,4c00hint 21hcodesg endsend start第8章 數(shù)據(jù)處理的兩個基本問題實(shí)驗7 尋址方式在結(jié)構(gòu)化數(shù)據(jù)訪問中的應(yīng)用編程,將data段中的數(shù)據(jù)按如下格式寫入到table段中,并計算21年中的人均收入(取整),結(jié)果也按照下面的格式保存在table段中。解:assume cs:codesg,ds:data,es:tabledata segmentdb 1975,1976,1977,1978,1979,1980,1981,1982,1983db 1984,1985,1986,1987,1988,1989,1990,1991,1992db 1993,1994,1995;以上是表示21年的21個字符串dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,dd ,;以上是表示21年公司總收的21個dword型數(shù)據(jù)dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,45257,17800;以上是表示21年公司雇員人數(shù)的21個word型數(shù)據(jù)data endstable segmentdb 21 dup(year summ ne ? )table endscodesg segmentstart:mov ax,datamov ds,axmov si,0mov ax,tablemov es,axmov di,0mov cx,21s:mov ax,ds:si ;年份轉(zhuǎn)送mov es:di,axmov ax,ds:si+2mov es:di+2,axmov ax,ds:si+84 ;收入轉(zhuǎn)送mov es:di+5,axmov dx,ds:si+84+2mov es:di+7,dxpush cx ;保護(hù)cxmov cx,ds:84+84+bx ;雇員數(shù)轉(zhuǎn)送mov es:di+0ah,cxdiv cx ;計算人均收入pop cxmov es:di+0dh,ax ;人均收入轉(zhuǎn)送add si,4add bx,2add di,16loop smov ax,4c00hint 21hcodesg endsend start第9章 轉(zhuǎn)移指令的原理檢測點(diǎn)9.1(1) 程序如下。assume cs:codedata segmentdb 0,0,0data endscode segmentstart: mov ax,datamov ds,axmov bx,0jmp word ptr bx+1code endsend start若要使程序中的jmp指令執(zhí)行后,CS:IP指向程序的第一條指令,在data段中應(yīng)該定義哪些數(shù)據(jù)?(2) 程序如下。assume cs:code,ds:datadata segmentdd hdata endscode segmentstart: mov ax,datamov ds,axmov bx,0mov bx,bx mov bx+2,cs jmp dword ptr ds:0code endsend start補(bǔ)全程序,使jmp指令執(zhí)行后,CS:IP指向程序的第一條指令。(3)用Debug查看內(nèi)存,結(jié)果如下:2000:1000 BE 00 06 00 00 00 .則此時,CPU執(zhí)行指令:mov ax,2000Hmov es,axjmp dword ptr es:1000H后,(CS)=? , (IP)=?解:CS=0006H,IP=00BEH檢測點(diǎn)9.2補(bǔ)全編程,利用jcxz指令,實(shí)現(xiàn)在內(nèi)存2000H段中找查第一個值為為0的字節(jié),找到后,將它的偏移地址存儲在dx中。assume cs:codecode segmentstart: mov ax,2000Hmov ds,axmov bx,0s: mov ch,0mov cl,bxjcxz okinc bxjmp short sok: mov dx,bxmov ax,4c00hint 21hcode endsend start檢測點(diǎn)9.3補(bǔ)全程序,利用loop指令,實(shí)現(xiàn)在內(nèi)存2000H段中查找第一個值為0的字節(jié),找到后,將它的偏移地址存儲在dx中。assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s: mov cl,bxmov ch,0inc cx inc bxloop sok: dec bxmov dx,bxmov ax,4c00hint 21hcode endsend start實(shí)驗8 分析一個奇怪的程序分析下面的程序,在運(yùn)行前思考:這個程序可以正確返回嗎?運(yùn)行后再思考:為什么是這種結(jié)果?通過這個程序加深對相關(guān)內(nèi)容的理解。assume cs:codesgcodesg segmentmov ax,4c00hint 21hstart: mov ax,0s: nopnopmov di,offset smov si,offset s2mov ax,cs:simov cs:di,axs0: jmp short ss1: mov ax,0int 21hmov ax,0s2: jmp short s1nopcodesg endsend start解:可以正常返回,jmp short s1的機(jī)器碼是EBF6,即使當(dāng)前的IP=IP-10,將這條指令移動到s:處后,jmp short s1不會指到s1了,而是指到相對當(dāng)前位置(jmp short s1的下一條指令)的-10的位置(mov ax,4c00h),所以這個程序可以正常返回。實(shí)驗9 根據(jù)材料編程編程:在屏幕中間分別顯示綠色、綠底紅色、白底藍(lán)色的字符串welcome to masm!。解:assume cs:codedata segmentdb welcome to masm! data endscode segmentstart: mov ax,datamov ds,axmov ax,0b800hmov es,axmov si,0mov di,10*160+80 ;第十行中間mov cx,16s1: mov al,ds:simov ah,B ;綠色mov es:di,axinc siinc diinc diloop s1mov si,0mov di,11*160+80 ;第十一行中間mov cx,16s2: mov al,ds:simov ah,B ;綠底紅色mov es:di,axinc siinc diinc diloop s2mov si,0mov di,12*160+80 ;第十二行中間mov cx,16s3: mov al,ds:simov ah,B ;白底藍(lán)色mov es:di,axinc siinc diinc diloop s3mov ax,4c00hint 21h ;如果要看到完整的顯示請輸入:“-g 4c”,即立即運(yùn)行到此條指令code endsend start注:此程序如果利用后面所學(xué)知識,可以將三次顯示嵌套簡化為一次。第10章 CALL和RET指令檢測點(diǎn)10.1補(bǔ)全程序,實(shí)現(xiàn)從內(nèi)存1000:0000處開始執(zhí)行指令。assume cs:codestack segmentdb 16 dup (0)stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax,1000hpush axmov ax,0push axretfcode endsend start檢測點(diǎn)10.2下面的程序執(zhí)行后,ax中的數(shù)值為多少?內(nèi)存地址 機(jī)器碼 匯編指令1000:0 b8 00 00 mov ax,01000:3 e8 01 00 call s1000:6 40 inc ax1000:7 58 s:pop ax解:ax=6檢測點(diǎn)10.3下面的程序執(zhí)行后,ax中的數(shù)值為多少?內(nèi)存地址 機(jī)器碼 匯編指令1000:0 b8 00 00 mov ax,01000:3 9a 09 00 00 10 call far ptr s1000:8 40 inc ax1000:9 58 s:pop axadd ax,axpop bxadd ax,bx解:ax=1010h檢測點(diǎn)10.4下面的程序執(zhí)行后,ax中的數(shù)值為多少?內(nèi)存地址 機(jī)器碼 匯編指令1000:0 b8 06 00 mov ax,61000:2 ff d0 call ax1000:5 40 inc ax1000:6 mov bp,spadd ax,bp解:ax=11檢測點(diǎn)10.5(1)下面的程序執(zhí)行后,ax中的數(shù)值為多少?注:不能用單步中斷測試程序,中斷涉及堆棧操作,不能帶便CPU的真實(shí)執(zhí)行結(jié)果。assume cs:codestack segmentdw 8 dup (0)stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ds,axmov ax,0call word ptr ds:0EHinc axinc axinc axmov ax,4c00hint 21hcode endsend start解:ax=3(2)下面的程序執(zhí)行后,ax中的數(shù)值為多少?assume cs:codestack segmentdw 8 dup (0)stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov word ptr ss:0,offset smov ss:2,cscall dword ptr ss:0nops: mov ax,offset ssub ax,ss:0cHmov bx,cssub bx,ss:0eHmov ax,4c00hint 21hcode endsend start解:ax=1,bx=0實(shí)驗10 編寫子程序1.顯示字符串;名稱:show_str;功能:在屏幕的指定位置,用指定顏色,顯示一個用0結(jié)尾的字符串;參數(shù):(dh)=行號,(dl)=列號(取值范圍080),(cl)=顏色,ds:si:該字符串的首地址;返回:顯示在屏幕上assume cs:daimashuju segmentdb fghfghf,0shuju endsdaima segmentkaishi:mov dh,8mov dl,21mov cl,2mov ax,shujumov ds,axmov si,0call show_strmov ax,4c00hint 21h;-show_str:push axpush cxpush dxpush espush sipush dimov ax,0b800hmov es,axdec dhmov al,160mul dhadd dl,dlmov dh,0 ;計算顯示在屏幕位置add ax,dxmov di,axmov ah,clx:mov cl,ds:simov ch,0jcxz fmov al,clmov es:di,axinc siinc diinc dijmp xf:pop dipop sipop espop dxpop cxpop axret;-daima endsend kaishi2.解決除法溢出問題;名稱: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:daimadaima segmentkaishi:mov ax,2390mov dx,0mov cx,10call divdwmov ax,4c00hint 21h;-divdw:push bxpush axmov ax,dxmov dx,0div cxmov bx,axpop axdiv cxmov cx,dxmov dx,bxpop bxret;-daima endsend kaishi3.數(shù)值顯示;名稱:dtoc_word;功能:將一個word型數(shù)轉(zhuǎn)化為字符串;參數(shù):(ax)=word型的數(shù)據(jù),ds:si指向字符串的首地址;返回:ds:si放此字符串,以0結(jié)尾assume cs:daimashuju segmentdb 20 dup(1)shuju endsdaima segmentkaishi:mov ax,shujumov ds,axmov ax,10100call dtoc_wordmov ax,4c00hint 21h;-dtoc_word:push axpush bxpush cxpush dxpush simov bx,0x:mov dx,0mov cx,10div cxmov cx,axadd dx,0push dxinc bxjcxz fjmp xf:mov cx,bxx1:pop ds:siinc siloop x1pop sipop dxpop cxpop bxpop axret;-daima endsend kaishi課程設(shè)計 1任務(wù):將實(shí)驗7中的Power idea公司的數(shù)據(jù)按照圖10.所示的格式在屏幕上顯示出來。解:;注:函數(shù)中的標(biāo)號為防止沖突,都加了本函數(shù)名為前綴;在Debug中輸入“-g 90”,直接運(yùn)行到結(jié)束assume cs:codedata segmentdb 1975,1976,1977,1978,1979,1980,1981,1982,1983db 1984,1985,1986,1987,1988,1989,1990,1991,1992db 1993,1994,1995;以上是表示21年的21個字符串dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,dd ,;以上是表示21年公司總收的21個dword型數(shù)據(jù)dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,45257,17800;以上是表示21年公司雇員人數(shù)的21個word型數(shù)據(jù)data endsagency segmentdb 8 dup(0)agency endscode segmentstart: mov ax,0b800hmov es,axmov di,0mov cx,80*24x: mov byte ptr es:di, ;將屏幕清空mov byte ptr es:di+1,0inc diinc diloop xmov ax,datamov es,axmov di,0mov bx,0mov ax,agencymov ds,axmov si,0mov dh,4mov cx,21x1: push cxmov ax,es:dimov ds:si,axmov ax,es:di+2mov ds:si+2,axmov byte ptr ds:si+4,0 ;顯示年份mov dl,0mov cl,2call show_strmov ax,es:84+dipush dxmov dx,es:84+di+2call dtoc_dword ;顯示收入pop dxmov dl,20mov cl,2call show_strmov ax,es:84+84+bxcall dtoc_wordmov dl,40 ;顯示雇員數(shù)mov cl,2call show_strmov ax,es:84+dipush dxmov dx,es:84+di+2div word ptr es:84+84+bx ;計算人均收入并顯示call dtoc_wordpop dxmov dl,60mov cl,2call show_stradd di,4add bx,2add dh,1pop cxloop x1mov ax,4c00hint 21h;名稱:show_str;功能:在屏幕的指定位置,用指定顏色,顯示一個用0結(jié)尾的字符串;參數(shù):(dh)=行號,(dl)=列號(取值范圍080),(cl)=顏色,ds:si:該字符串的首地址;返回:顯示在屏幕上show_str:push axpush cxpush dxpush espush sipush dimov ax,0b800hmov es,axmov al,160mul dhadd dl,dlmov dh,0add ax,dxmov di,axmov ah,clshow_str_x:mov cl,ds:simov ch,0jcxz show_str_fmov al,clmov es:di,axinc siinc diinc dijmp show_str_xshow_str_f:pop dipop sipop espop dxpop cxpop axret;名稱:dtoc_word;功能:將一個word型數(shù)轉(zhuǎn)化為字符串;參數(shù):(ax)=word型的數(shù)據(jù),ds:si指向字符串的首地址;返回:ds:si放此字符串,以0結(jié)尾dtoc_word:push axpush bxpush cxpush dxpush simov bx,0dtoc_word_x:mov dx,0mov cx,10div cxmov cx,axadd dx,0push dxinc bxjcxz dtoc_word_fjmp dtoc_word_xdtoc_word_f:mov cx,bxdtoc_word_x1:pop ds:siinc siloop dtoc_word_x1pop sipop dxpop cxpop bxpop axret;名稱:dtoc_dword;功能:將一個double word型數(shù)轉(zhuǎn)化為字符串;參數(shù):(dx)=數(shù)的高八位,(ax)=數(shù)的低八位;返回:ds:si放此字符串,以0結(jié)尾;備注:會用到divdw函數(shù)dtoc_dword:push axpush bxpush cxpush dxpush simov bx,0dtoc_dword_x:mov cx,10call divdwpush cxinc bxcmp ax,0jne dtoc_dword_xcmp dx,0jne dtoc_dword_xmov cx,bxdtoc_dword_x1:pop ds:siadd byte ptr ds:si,0inc siloop dtoc_dword_x1pop sipop dxpop cxpop bxpop axret;名稱: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 bxpush axmov ax,dxmov dx,0div cxmov bx,axpop axdiv cxmov cx,dxmov dx,bxpop bxretcode endsend start第11章 標(biāo)志寄存器檢測點(diǎn)11.1寫出下面每條指令后,ZF、PF、SF等標(biāo)志位的值。ZF PF SFsub al,al 1 1 0mov
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 換個角度看2025年一級建造師試題及答案
- 對比分析歷年考題試題及答案
- 護(hù)理培訓(xùn)與進(jìn)修試題及答案
- 2025年中級會計測試題及答案探索
- 2025年一級建造師最后沖刺試題及答案
- 2025年建造師考試策略分享試題及答案
- 無人機(jī)在農(nóng)業(yè)領(lǐng)域的應(yīng)用價值試題及答案
- 護(hù)士職業(yè)倫理試題及答案
- 備考計劃制定一級建造師試題及答案
- 審計風(fēng)險管理試題及答案評析
- 高中英語-英語說課
- 聯(lián)想EAP案例分析
- 內(nèi)容分析法課件
- 員工工資條模板
- 社會工作介入老年社區(qū)教育的探索
- 14K118 空調(diào)通風(fēng)管道的加固
- 高考倒計時30天沖刺家長會課件
- 無線系統(tǒng)組成及原理
- 全過程工程咨詢服務(wù)技術(shù)方案
- 第十五章巷道與井筒施工測量
- 施工項目現(xiàn)金流預(yù)算管理培訓(xùn)課件
評論
0/150
提交評論