实验5 编写、调试具有多个段的程序
本章實驗的主題主要講代碼段、數據段、棧段的使用。
(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執行程序,程序返回前,data段中的數據是多少?
- cpu執行程序,程序返回前,cs=004h, ss=076bh, ds=076ah
- 設程序加載后,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這些程序是以后復雜程序的架子,這個架子從剛開始的簡陋到最后的豐滿,是一步一步建成的,看看計算機的發展史,就明白了一個道理,不要不在乎自己寫的helloword,堅持下去就是牛逼的東西。
這個程序本身沒什么意思,在程序執行到最后,觀察一下相關寄存器的情況,實驗結果如下:
然后可以推知:該程序加載后,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這段代碼和上一段對比,就是把data段和stack段放到了最后,看下程序執行返回前(就是int 21h前),相關寄存器的情況:
這時,CS, SS, DS三個寄存器的位置關系發生了變化,和上面兩種情況可以對比一下,分別從程序的角度和內存的角度體會棧段的使用、變化情況。
(4)
如果將(1)(2)(3)題中的最后一條偽指令“end start”改為end(也就是說不指明函數的入口),則哪個程序仍然可以正確的執行?
第三個程序,因為不指明程序入口時,cs:codesegment默認ip為0,第三個程序正好是程序開始的地方,前兩個ip=0開始的地方存的是數據,解析為匯編指令是錯誤的。這里也就明白什么時候用end,什么時候用end start,不過所有時刻用end start絕對沒錯。
(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三個數據段是怎么分布的,如下圖:
每個段都不到16個字節,但是三個段絕對不是一個接著一個排列,而是另起一行重新開始,也就是說當一個數據段湊不夠正行時,那下一段的數據,棧,代碼也都是另起一行。
下面按照實驗要求的代碼如下:
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實驗結果如下:
(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實驗結果:
說明:細細想來,人每天的活動都是按套路做事的,寫程序也莫過于與此,不是每一步都要創新,那樣效率太慢,也太艱辛了,所以這樣導出了學習的一個本質,先學個粗略的模型,先干著,就像學駕照一樣,先學幾招能把車穩當安全的開走即可,至于漂移也只是更難的套路;回到程序中,ds,es,si這些設置都是套路。
總結
以上是生活随笔為你收集整理的实验5 编写、调试具有多个段的程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java消息顺序执行_Apache Fl
- 下一篇: 【软件工程】软件测试报告——软件测试说明