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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验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 编写、调试具有多个段的程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。