日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实验5 编写、调试具有多个段的程序

發(fā)布時(shí)間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验5 编写、调试具有多个段的程序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本章實(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。