pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

8086匯編開發環境搭建和Debug模式介紹(圖文詳解

這篇文章主要介紹了8086匯編開發環境搭建和Debug模式介紹,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

1. 8086匯編開發環境搭建

  在上篇博客中簡單的介紹了8086匯編語言。工欲善其事,必先利其器,在8086匯編語言正式開始學習之前,先介紹一下如何搭建8086匯編的開發環境。

  匯編語言設計之初是用于在沒有操作系統的裸機上直接操作硬件的,但對于大部分人來說,在8086裸機上直接進行編程將會面臨各種困難。好在我們可以使用軟件模擬器來模擬硬件進行8086的學習實踐。在《匯編語言》中作者推薦通過windows環境下的masm和debug進行學習。

masm介紹:

  masm是一款DOS下的匯編工具包,在8086匯編的學習中我們需要其中的幾個文件,分別是masm.exe,link.exe。

  masm.exe匯編器,用于將文本格式的匯編語言源文件編譯為.obj結尾的二進制文件,其生成的.obj結尾的二進制目標文件是被編譯的源文件的對應的機器碼。單獨的源程序目標文件通常是無法直接運行的,還需要和互相依賴的其它同樣編譯完成的二進制文件鏈接在一起才能生成最終的可執行文件(比如所需要的靜態庫函數)。因此,obj文件通常也被叫做中間文件。

  link.exe鏈接器,obj文件需要通過鏈接才能轉換成可執行程序,而鏈接器就是負責完成這一任務的。鏈接器能將多個obj目標文件以及其所依賴的庫程序進行統一處理(例如多個目標文件中指令、數據內存地址的偏移處理),并生成可執行文件。

debug介紹:

  debug.exe調試器,windows提供了一個在dos中調試8086匯編程序的工具debug.exe,提供了展示程序運行時CPU中各寄存器、內存中數據,指令級的單步調試等功能。debug程序的使用會在本篇博客的后半段進行詳細介紹。

64位操作系統兼容性問題:

  由于《匯編語言》一書出版較早,當時的windows系統還是32位的,32位windows系統都默認安裝了masm與debug,能打開dos窗口直接使用。但目前普遍使用的、新的windows 64位操作系統中卻并沒有默認提供masm工具包和debug.exe,同時masm、debug也與64位的windows系統版本不兼容。

想在64位的windows系統下使用masm、debug有兩個常用方法:

  1. 通過虛擬機安裝一個老版本的windows操作系統(推薦windows xp)

  2. 通過DOSBox這一輕量級的ms-dos模擬器來運行,但上文所述的依賴程序需單獨下載(百度網盤下載鏈接:

鏈接: https://pan.baidu.com/s/1JlOEFoV7h37Z_NY7NKc-gw

提取碼: x3ai

  個人推薦第二種方法,下面介紹如何在windows64位操作系統下使用DOSBox來搭建8086匯編語言的開發環境。

DOSBox安裝與使用

DOSBox下載安裝:

  DOSBox可以在官網下載,這里也提供了百度網盤的下載鏈接(0.74版本):

鏈接: https://pan.baidu.com/s/1W3f6_jsSK4HrHWDO_IfqRg

提取碼: 7ugx

  安裝完畢后,找到安裝目錄下的DOSBox.exe并啟動,能看到如下圖界面。

  

  作為dos的模擬器和普通的dos窗口沒有明顯區別,但是初始時并不能直接訪問到本地磁盤,需要先將本地磁盤掛載到DOSBox中。

DOSBox掛載本地磁盤:

  1. 在本地操作系統磁盤上選擇一個文件夾目錄,作為掛載的磁盤路徑(例如C:\dos)

  2. 在DOSBox啟動的dos窗口中執行命令:mount C C:\dos(代表著將本地的C:\dos路徑掛載到DOSBox的C盤路徑下),能把dos窗口的工作目錄切換到C盤,接下來就可以正常訪問被掛載的磁盤路徑下的內容了。

  3. 將前面提到過的debug.exe等文件都放在這個掛載的本地磁盤路徑下(例如C:\dos),通過DOSBox就可以兼容的運行masm工具包中的程序和debug.exe了

  

添加自動執行腳本以避免重復操作:

  由于上述DOSBox的磁盤掛載是臨時的,每次重新啟動DOSBox后都需要重新輸入命令進行掛載,太麻煩了。我們可以通過修改DOSBox配置的方式,免去這些重復的操作。

  找到DOSBox安裝目錄下的DOSBox 0.74 Options.bat,使用系統自帶的記事本直接打開,暫不研究其它配置段的作用,找到最后的【autoexec】段,配置在【autoexec】的內容會作為命令在DOSBox啟動時按順序被自動執行。  

  將掛載磁盤操作命令配置在【autoexec】段中能避免重復操作。修改并保存配置文件后,重新啟動DOSBox,發現配置中添加的命令會被自動執行。

  

2. 8086debug模式介紹

  在搭建好了8086匯編的開發環境后,接下來介紹8086的debug模式。執行debug.exe以進入debug調試模式,在dos中通過輸入命令的方式進行交互。

  

  debug模式下有20多種不同命令,限于篇幅這里只會介紹幾個以后實驗時常用到的命令。(通過回車執行命令,DOS下的命令默認是不區分大小寫的)

R命令查看/改變CPU寄存器內容

  R命令的作用是查看和修改debug模式下CPU中寄存器的值。

  (-r)單獨的輸入r,可以查看當前CPU的內容

  (-r 寄存器名) r加上寄存器名可以在接下來的":"提示后輸入新的值,以達到修改對應寄存器內容的目的(示例中第二行 AX 0000表示修改前寄存器AX的值為0000)

  

D命令 查看內存中的內容

  D命令的作用是查看內存中的內容。

  D命令有許多不同的傳參方式可供使用,先介紹最易理解的(段地址:偏移地址)查看方式。D命令默認會顯示尋址地址開始的后128個內存單元的內容,以16進制的方式顯示(每個內存單元8位,一行最多16個內存單元),而最右邊會將內存單元中的二進制數據以ascll碼的形式翻譯展示。

  

  有時,我們只想聚焦于某一部分內存地址的內容,而默認展示的內存視圖不是很方便。

  D命令提供了另外一種訪問內存的方式(段地址:偏移起始地址 偏移終止地址),其能夠展示(段地址:偏移起始地址 至 段地址:偏移終止地址)的內存信息,范圍兩端均為閉區間。

  

E命令 改變內存中的內容

  E命令的作用是改變內存中的內容。

  和對CPU中寄存器的查看,修改不同,對內存進行查看和修改較為復雜,為此debug設計了兩個不同的命令分別進行控制(E命令修改內存、D命令查看內存)。

  通過(E 起始地址 數據1 數據2 數據3...)命令可以修改內存中以起始地址開始,順序的N個內存單元的值(N為實際參數傳遞的數量)。

  

  也可以和R命令修改CPU中寄存器值類似的,通過提示來修改特定內存單元的值。00.12 00代表內存單元在修改前的值,12是我們手動輸入的、需要修改的新值。

  

  可以通過E命令向內存輸入對應的機器指令,因為機器指令也是數據的一種。

有以下指令(左側為機器碼,右側為對應的匯編指令):

  B80100  mov ax,0001

  BB0200  mov bx,0002

  01D8   add ax,bx

  我們可以向內存1000:0處寫入這些機器指令,以供接下來通過debug執行這段機器指令 (執行命令:E 1000:0 B8 01 00 BB 02 00 01 D8)。

  

U命令 將內存數據轉換為匯編指令展示

  U命令的作用是將內存中的二進制數據轉換為匯編指令展示(反匯編)。

  D命令能夠將內存中的數據以16進制或ascll碼的形式展現出來,但有時我們需要觀察的是內存中的機器指令時,D命令的視圖過于抽象,不利于理解。debug提供了U命令來解決這個問題。

  對于前面我們在1000:0處輸入的機器指令,使用 U 1000:0 命令(u 內存地址)可以將內存中的數據以匯編語言指令的方式進行展示。

  

  可以觀察到,左邊展示的是內存地址,中間則是16進制的內存視圖,右邊展示的是內存中數據所對應的匯編指令(例如:1000:0000;B80100;MOV AX,0001)。

  由于我們只輸入了三條匯編指令,而后面內存中的數據并不是我們想要執行的,但U命令卻依然將其以匯編指令的形式轉換并顯示出來了。

  這也是前一篇博客所提到的,內存中的數據完全是二進制的,既可以將其看做普通的二進制數據、十六進制數據、ascll碼文本數據,也可以視作程序指令,這些二進制的"數據"的處理完全取決于如何對其進行解釋。

T命令 單步執行機器指令

  T命令的作用是進行單步機器指令的調試

  以上文通過E命令寫入內存1000:0的三條指令舉例,介紹如何使用T命令來讓CPU執行1000:0處的機器指令。T命令用于單步調試,一次只會執行一條機器指令。

  8086CPU在運行時會將CS:IP寄存器所指向的內存單元中的內容解釋為指令執行,要將內存1000:0處的內容作為指令執行必須先修改CS、IP兩個寄存器的值,使之指向1000:0。

  

  先執行一次T命令,1000:0處的指令(mov ax,0001)便會被執行,可以觀察到寄存器ax的值已經變成了0001;同時寄存器IP的值增加了3(mov ax,0001的指令長度為3),此時CS:IP指向的便是位于1000:3處的下一條指令(mov bx,0002),在視圖的最后一行中也有所體現。

  

  再執行一次T命令,會執行1000:3處的指令(mov bx,0002),可以觀察到寄存器bx的值變成了0002;寄存器IP的值又增加了3(mov bx,0002的指令長度也是3),此時CS:IP指向的便是位于1000:6處的下一條指令(add ax,bx)。

  

  最后執行一次T命令,add ax,bx會被執行(類似 ax=ax+bx)。寄存器ax的值已經變成了之前寄存器ax和bx中的數據之和0003;寄存器IP的值增加了2(add ax,bx的指令長度是2),CS:IP指向1000:8。

  

A命令 以匯編指令的形式向內存中寫入內容

  A命令能夠以匯編指令的形式向內存中寫入內容

  對于內存操作,D命令可以查看內存中的內容,但如果想查看的是程序指令,顯然U命令更加方便;E命令可以向內存中寫入數據,但對于程序指令的寫入,直接操作二進制機器碼的方式過于硬核。為此,debug提供了A命令,我們可以通過A命令以匯編指令的形式向內存中寫入內容。

  通過A命令將(mov ax,0001,mov bx,0002,add ax,bx)三條指令寫入內存1000:0處:

  

  通過A命令進行指令的寫入,和E命令達到的效果一樣,但使用起來卻更加便捷。A命令能夠自動識別所輸入匯編指令的長度,正確的在內存中寫入程序指令。

  debug提供了D、E兩種命令用于對內存進行通用的操作(純二進制、十六進制數據的讀、寫)。

  對于程序指令,debug提供了U、A兩種命令以更人性化的方式來讀寫內存中的指令內容。

三 總結

  在debug模式下可以模擬8086匯編非常自由的控制CPU和內存,這也是匯編語言的強大之處和魅力所在。

貼近硬件底層的編程能夠讓我們編寫出來的程序非常高效,但也存在一些問題:

  1.內存中的內容被當做指令還是數據來處理完全取決于如何解釋,編程時稍有不慎就會導致CPU執行一些不應該執行的指令,甚至造成巨大的破壞。

  2.在未來還會介紹如何使用匯編語言來實現高級語言中出現的結構體、數組等概念。這些數據結構完全是程序邏輯上的,內存本身可沒有這些功能。因此在使用匯編訪問內存中結構化的數據時,一不小心就會出現內存訪問越界,錯位等問題。

  3.匯編語言的抽象程度過低,許多在高級語言中很簡單的功能在匯編中也需要很多的代碼來實現(匯編實現的控制臺打印helloworld可能是常用語言中最繁瑣的了)。

  編程語言的貼近底層與機器高效性如果站在更高的角度上看其實是一把雙刃劍:直接操控底層的機器方便,機器執行效率高的同時,也是危險、開發效率底下的。匯編語言程序員不得不付出巨大的精力來仔細思考、斟酌這些底層機器層面的細節,以避免出現相關bug,大大降低了開發效率。這也是高級語言誕生,并不斷發展的主要原因。

  高級語言大家族中按抽象程度來看,從偏底層的C,C++到java、python等,再到目前抽象程度最高的lisp。隨著抽象程度的提高,離機器底層越遠,執行效率通常也隨之降低。但程序員所需要考慮的機器細節也就越少,能更專注于業務邏輯,進而提高了開發效率。比如在使用C編程時還需要仔細考慮指針錯誤,堆上無用內存回收等問題,到了更高級的java、python中,這些問題都交由編譯器、虛擬機解決了,對開發人員也幾乎透明了。

  天下沒有免費的午餐,在選擇適合的編程語言開發程序時,需要在機器執行效率和開發效率間做出取舍。但隨著科學技術的發展,計算機硬件會越來越強大,對機器效率的擔憂會越來越少,對程序開發效率的考慮將占據主導地位,越來越多的程序將會傾向于使用抽象程度更高的編程語言進行開發。

  雖然需要使用匯編語言的場合越來越少,但對匯編語言和底層機器硬件有一定的了解的話,依然能夠幫助程序員更深刻的理解上層的知識內容、寫出更高效的程序。

  畢竟,人類是無法抽象、封裝到完美無缺的,有時還是你需要跳進下水道,深入底層一探究竟的。

  總結

以上所述是小編給大家介紹的8086匯編開發環境搭建和Debug模式介紹,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對html5模板網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

主站蜘蛛池模板: LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 | 急救箱-应急箱-急救包厂家-北京红立方医疗设备有限公司 | 二手回收公司_销毁处理公司_设备回收公司-找回收信息网 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | 纸布|钩编布|钩针布|纸草布-莱州佳源工艺纸布厂 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 橡胶弹簧|复合弹簧|橡胶球|振动筛配件-新乡市永鑫橡胶厂 | 骨龄仪_骨龄检测仪_儿童骨龄测试仪_品牌生产厂家【品源医疗】 | 杭州公司变更法人-代理记账收费价格-公司注销代办_杭州福道财务管理咨询有限公司 | 宝鸡市人民医院 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 北京租车牌|京牌指标租赁|小客车指标出租| 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 裹包机|裹膜机|缠膜机|绕膜机-上海晏陵智能设备有限公司 | 网站优化公司_北京网站优化_抖音短视频代运营_抖音关键词seo优化排名-通则达网络 | 济南办公室装修-厂房装修-商铺装修-工装公司-山东鲁工装饰设计 | 气动隔膜阀_气动隔膜阀厂家_卫生级隔膜阀价格_浙江浙控阀门有限公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 航空铝型材,7系铝型材挤压,硬质阳*氧化-余润铝制品 | 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 四川成人高考_四川成考报名网 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 除甲醛公司-甲醛检测治理-杭州创绿家环保科技有限公司-室内空气净化十大品牌 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 幂简集成 - 品种超全的API接口平台, 一站搜索、试用、集成国内外API接口 | 选矿设备-新型重选设备-金属矿尾矿重选-青州冠诚重工机械有限公司 | 河南档案架,档案密集架,手动密集架,河南密集架批发/报价 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 宜兴紫砂壶知识分享 - 宜兴壶人 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 对辊破碎机-液压双辊式,强力双齿辊,四辊破碎机价格_巩义市金联机械设备生产厂家 |