实验5 编写、调试具有多个段的程序
本章實(shí)驗(yàn)的主題主要講代碼段、數(shù)據(jù)段、棧段的使用。
(1)
assume cs:code, ds:data, ss:stackdata segmentdw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data endsstack segmentdw 0, 0, 0, 0, 0, 0, 0, 0 stack endscode segment start: mov ax, stackmov ss, axmov sp, 16 ;ss:sp stackmov ax, datamov ds, ax ;ds datapush ds:[0]push ds:[2]pop ds:[2]pop ds:[0]mov ax, 4c00hint 21hcode ends end start- cpu執(zhí)行程序,程序返回前,data段中的數(shù)據(jù)是多少?
- cpu執(zhí)行程序,程序返回前,cs=004h, ss=076bh, ds=076ah
- 設(shè)程序加載后,code段的地址為X,則data段的地址X-2,stack段為X-1
(2)
assume cs:code, ds:data, ss:stackdata segmentdw 0123h, 0456h data endsstack segmentdw 0, 0 stack endscode segment start:mov ax, stackmov ss, axmov sp, 16 ;ss:sp stackmov ax, datamov ds, axpush ds:[0]push ds:[2]pop ds:[2]pop ds:[0]mov ax, 4c00hint 21h code ends end start這些程序是以后復(fù)雜程序的架子,這個(gè)架子從剛開始的簡(jiǎn)陋到最后的豐滿,是一步一步建成的,看看計(jì)算機(jī)的發(fā)展史,就明白了一個(gè)道理,不要不在乎自己寫的helloword,堅(jiān)持下去就是牛逼的東西。
這個(gè)程序本身沒什么意思,在程序執(zhí)行到最后,觀察一下相關(guān)寄存器的情況,實(shí)驗(yàn)結(jié)果如下:
然后可以推知:該程序加載后,code段的段地址為X,則data段的段地址X-2,stack的段地址為X-1
(3)
assume cs:code, ds:data, ss:stackcode segment start:mov ax, stackmov ss, axmov sp, 16 ;ss:sp stackmov ax, datamov ds, axpush ds:[0]push ds:[2]pop ds:[2]pop ds:[0]mov ax, 4c00hint 21hdata segmentdw 0123h, 0456hdata endsstack segmentdw 0, 0stack endscode ends end start這段代碼和上一段對(duì)比,就是把data段和stack段放到了最后,看下程序執(zhí)行返回前(就是int 21h前),相關(guān)寄存器的情況:
這時(shí),CS, SS, DS三個(gè)寄存器的位置關(guān)系發(fā)生了變化,和上面兩種情況可以對(duì)比一下,分別從程序的角度和內(nèi)存的角度體會(huì)棧段的使用、變化情況。
(4)
如果將(1)(2)(3)題中的最后一條偽指令“end start”改為end(也就是說不指明函數(shù)的入口),則哪個(gè)程序仍然可以正確的執(zhí)行?
第三個(gè)程序,因?yàn)椴恢该鞒绦蛉肟跁r(shí),cs:codesegment默認(rèn)ip為0,第三個(gè)程序正好是程序開始的地方,前兩個(gè)ip=0開始的地方存的是數(shù)據(jù),解析為匯編指令是錯(cuò)誤的。這里也就明白什么時(shí)候用end,什么時(shí)候用end start,不過所有時(shí)刻用end start絕對(duì)沒錯(cuò)。
(5)
assume cs:codea segmentdb 1,2,3,4,5,6,7,8 a endsb segmentdb 1,2,3,4,5,6,7,8 b endsc segmentdb 1,2,3,4,5,6,7,8 c endscode segment start:mov ax, amov ds, axmov bx, 0code ends end start先看a,b,c三個(gè)數(shù)據(jù)段是怎么分布的,如下圖:
每個(gè)段都不到16個(gè)字節(jié),但是三個(gè)段絕對(duì)不是一個(gè)接著一個(gè)排列,而是另起一行重新開始,也就是說當(dāng)一個(gè)數(shù)據(jù)段湊不夠正行時(shí),那下一段的數(shù)據(jù),棧,代碼也都是另起一行。
下面按照實(shí)驗(yàn)要求的代碼如下:
assume cs:codea segmentdb 1,2,3,4,5,6,7,8 a endsb segmentdb 1,2,3,4,5,6,7,8 b endsc segmentdb 8 dup(0) c endscode segment start:mov ax, amov ds, axmov bx, 0 ;bx, first position of a piece of datamov cx, 8mov si, 0 ;si, loop varibless: mov al, 0 ;al, temp varibleadd al, [bx+si]add al, [bx+si+10h]mov [bx+si+10h+10h], alinc siloop smov ax, 4c00hint 21hcode ends end start實(shí)驗(yàn)結(jié)果如下:
(6)
代碼如下:
assume cs:codea segmentdw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a endsb segmentdw 8 dup(0) b endscode segment start:mov ax, amov ds, axmov bx, 0 ;ds:bx, source datamov ax, bmov es, ax ;es:bx, destination datamov si, 0 ;loop variblemov cx, 8 s: mov ax, ds:[bx+si]mov es:[bx+si], axadd si, 2 ;word typeloop smov ax, 4c00hint 21h code ends end start實(shí)驗(yàn)結(jié)果:
說明:細(xì)細(xì)想來,人每天的活動(dòng)都是按套路做事的,寫程序也莫過于與此,不是每一步都要?jiǎng)?chuàng)新,那樣效率太慢,也太艱辛了,所以這樣導(dǎo)出了學(xué)習(xí)的一個(gè)本質(zhì),先學(xué)個(gè)粗略的模型,先干著,就像學(xué)駕照一樣,先學(xué)幾招能把車穩(wěn)當(dāng)安全的開走即可,至于漂移也只是更難的套路;回到程序中,ds,es,si這些設(shè)置都是套路。
總結(jié)
以上是生活随笔為你收集整理的实验5 编写、调试具有多个段的程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java消息顺序执行_Apache Fl
- 下一篇: 【软件工程】软件测试报告——软件测试说明