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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

第一个程序---汇编学习笔记

發(fā)布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一个程序---汇编学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第四章 第一個程序


4.1 一個源程序從寫出到執(zhí)行的過程

一個匯編語言程序從寫到最終執(zhí)行的簡要過程。

  • 編寫匯編源程序
  • 對源程序進(jìn)行編譯連接
  • 執(zhí)行可執(zhí)行文件中的程序
  • 如圖所示:


    4.2 源程序

    程序代碼如下:

    ;assume是假設(shè) assume cs:codesg;偽指令 ;段名 segment codesg segmentmov ax,0123Hmov bx,0456Hadd ax,bxadd ax,ax;程序返回,沒有下面2句,程序發(fā)生邏輯錯誤mov ax,4c00Hint 21Hcodesg ends ;段名 endsend ;end是匯編程序的結(jié)束標(biāo)記

    以上代碼相關(guān)說明:

    編譯連接后:


    4.3 編輯源程序

    過程:

  • 打開編輯器
  • 在編輯器中編輯程序。

  • 4.4 編譯

    **編譯**T1.asm文件,如圖:

    一般來說,有兩類錯誤使我們得不到所期望的目標(biāo)文件:

  • 程序中有“Severe Errors”。
  • 找不到所給出的源程序文件。
  • 在編譯過程中,我們提供一個輸入:T1。最多可以的到三個輸出:目標(biāo)文件(.obj)、目標(biāo)文件(.lst)、交叉引用文件(.crf)。目標(biāo)文件使我們最終得到的結(jié)果,而另外兩個只是中間結(jié)果,可以讓編譯器忽略對它們的生成。


    4.5 連接

    **連接**T1.obj文件,如圖:

    這個程序中有一個警告錯誤:“沒有棧段”,這里我們不理會這個錯誤。

    第一個是輸入:目標(biāo)文件輸出是:可執(zhí)行文件名、映像文件的生成、庫文件的連接

    連接的作用:

  • 當(dāng)源程序很大時,可以將它分為多個源程序文件來編譯,每個源程序編譯成為目標(biāo)文件后,再用連接程序?qū)⑺麄冞B接到一起,生成一個可執(zhí)行文件;
  • 程序中調(diào)用了某個庫文件中的子程序,需要將這個庫文件和該程序生成的目標(biāo)文件連接到一起,生成一個可執(zhí)行文件;
  • 一個源程序編譯后,得到了存有機(jī)器碼的目標(biāo)文件,目標(biāo)文件中的有些內(nèi)容還不能直接用來生成可執(zhí)行文件,連接程序?qū)⑦@些內(nèi)容處理為最終的可執(zhí)行信息。所以,在只有一個源程序文件,而又不需要調(diào)用某個庫中的子程序的情況下,也必須用連接程序?qū)δ繕?biāo)文件進(jìn)行處理,生成可以執(zhí)行文件。

  • 4.6 以簡化的方式進(jìn)行編譯和連接

    如圖,在命令行的結(jié)尾加上分號


    4.7 T1.exe的執(zhí)行

    運(yùn)行后沒有任何結(jié)果,這很正常!因?yàn)槲覀兪菍拇嫫髯霾僮?#xff0c;并不是顯示到屏幕上。


    4.8 誰將可執(zhí)行文件中的程序轉(zhuǎn)載進(jìn)入內(nèi)存并使它運(yùn)行?

    按照上面原理,我們來看一下4.7節(jié)中的T1.exe的執(zhí)行過程(思考相關(guān)的問題)。

  • 在提示符“c:\”后面輸入可執(zhí)行文件的名字“T1”,按Enter鍵。這時,請思考問題4.1。
  • T1.exe中的程序運(yùn)行。
  • 運(yùn)行結(jié)束,返回,再次顯示提示符“c:\”。
  • 問題 4.1

    此時,有一個正在運(yùn)行的程序?qū)?T1.exe 中的程序加載入內(nèi)存,這個正在運(yùn)行的程序是什么?它將程序加載入內(nèi)存后,如何使程序得以運(yùn)行?

    問題 4.2

    程序運(yùn)行結(jié)束后,返回到哪里?

    我們來了解一下操作系統(tǒng)的外殼

    操作系統(tǒng)是一個由多個功能模塊組成的龐大、復(fù)雜的軟件系統(tǒng)。任何通用的操作系統(tǒng),都要提供一個稱為 shell(外殼)的程序,用戶(操作人員)使用這個程序來操作計算機(jī)系統(tǒng)進(jìn)行工作。DOS中有一個程序command.com,在這個程序在DOS中稱為命令解釋器,也就是DOS系統(tǒng)的shell。DOS啟動時,先完成其他重要的初始化工作,然后運(yùn)行 command.com,command.com運(yùn)行后,執(zhí)行完 其他的相關(guān)任務(wù)后,在屏幕上顯示出由當(dāng)前盤符和當(dāng)前路徑組成的提示符,比如:“c:\”或“c:\windows”等, 然后等待用戶的輸入。用戶可以輸入所要執(zhí)行的命令,比如,cd、dir、type等,這些命令由command執(zhí)行,command執(zhí)行完 這些命令后,再次顯示由當(dāng)前盤符和當(dāng)前路徑組成的提示符,等待用戶的輸入。如果用戶要執(zhí)行一個程序,則輸入該程序的可執(zhí)行文件的名稱,command首先根據(jù)文件名找到可執(zhí)行文件, 然后將這個可執(zhí)行文件中的程序加載入內(nèi)存,設(shè)置CS:IP指向程序的入口。此后,command暫停運(yùn)行,CPU運(yùn)行 程序。程序運(yùn)行結(jié)束后,返回到command中,command再次顯示當(dāng)前盤符和當(dāng)前路徑組成的提示符,等待用戶的 輸入。在DOS中,command處理各種輸入:命令或要執(zhí)行的程序的文件名。我們就是通過command來進(jìn)行工作的。

    現(xiàn)在來回答問題4.1和4.2中所提到的問題。
    (1) 在DOS中直接執(zhí)行T1.exe時,是正在運(yùn)行的command,將T1.exe中的程序加載入內(nèi)存;
    (2) command設(shè)置CPU的CS:IP指向程序的第一條指令(即程序的入口)。從而使程序得以運(yùn)行;
    (3) 程序運(yùn)行結(jié)束后,返回command中,CPU繼續(xù)運(yùn)行command。


    4.9 程序執(zhí)行過程的跟蹤

    在編寫程序的時候,常常會出現(xiàn)我們的語法沒有錯誤,而邏輯出現(xiàn)錯誤。這個時候我們就需要拿起強(qiáng)有力的工具,就是我們的 Debug

    通過command的命令:Debug T1.exe

    由上圖,我們可以知道兩個信息。

  • 程序加載后,ds 中存放著程序所在的內(nèi)存區(qū)的段地址,這個內(nèi)存區(qū)的偏移地址為 0,則程序所在的內(nèi)存區(qū)地址為 ds:0;
  • 這個內(nèi)存區(qū)的前 256 個字節(jié)中存放的是 PSP,DOS 用來和程序進(jìn)行通信。從 256 字節(jié)處向后的空間存放的是程序。
  • 我們可以用Debug T1.exe實(shí)驗(yàn)一下,如圖。

    發(fā)現(xiàn)DS=075A,CS=076A,但是,發(fā)現(xiàn)一個SS和書上的不一樣,一個是相差10H,而實(shí)際上我們做的實(shí)驗(yàn)是相差了09H,我想可能標(biāo)準(zhǔn)不一樣吧。我們忽略細(xì)節(jié)(找不到為什么,不過我們只要知道 PSP 是256個字節(jié)就對了)。

    當(dāng)我們執(zhí)行到 int 21h 的時候,需要使用 p命令,這里不說明原因(因?yàn)閠命令是單步執(zhí)行,而p是跳出循環(huán))。

    q命令 退出Debug。


    實(shí)驗(yàn) 3 編程、編譯、連接、跟蹤

    這里先吐槽一下,前面2章教我們使用命令的時候,我做筆記是有點(diǎn)想吐的。因?yàn)樘哂嗔?#xff0c;我們只要記住某些命令就行了。可能是本人認(rèn)為學(xué)習(xí)匯編是為了學(xué)習(xí)匯編語言的思想。也許我們需要使用到比如像“中斷”這樣模式的編程。

    (1)將下面的程序保存為 t1.asm 文件,將其生成可執(zhí)行文件 t1.exe 。
    (2)用 Debug 跟蹤 t1.exe 的執(zhí)行過程,寫出每一步執(zhí)行后,相關(guān)寄存器中的內(nèi)容和棧頂?shù)膬?nèi)容。

    assume cs:codesgcodesg segmentmov ax,2000h ;ax = 2000hmov ss,ax ;ss = 2000hmov sp,0 ;sp = 0hadd sp,10 ;sp = 10hpop ax ;ax = 0hpop bx ;bx = 0hpush ax ;ss:e = 0hpush bx ;ss:c = 0hpop ax ;ax = 0hpop bx ;ax = 0hmov ax,4c00hint 21hcodesg endsend

    編寫完代碼后,如圖。

    這樣生成了t1.exe文件。

    (3)PSP的頭兩個字節(jié)是CD 20,用 Debug 加載 t1.exe,查看PSP的內(nèi)容。
    (注意,一定要做完這個實(shí)驗(yàn)才能進(jìn)行下面的課程。)


    本章完。

    總結(jié)

    以上是生活随笔為你收集整理的第一个程序---汇编学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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