请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

8086汇编语言学习(二) 8086汇编开发环境搭建和Debug模式介绍

[复制链接]
查看: 7|回复: 0

2万

主题

2万

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
70839
发表于 2020-1-17 02:35 | 显示全部楼层 |阅读模式
1. 8086汇编斥地情况搭建

  在上篇博客中简单的先容了8086汇编说话。工欲善其事,必先利其器,在8086汇编说话正式起头进修之前,先先容一下怎样搭建8086汇编的斥地情况。
  汇编说话计划之初是用于在没有操纵系统的裸机上间接操纵硬件的,但对于大部分人来说,在8086裸机上间接举行编程将碰面临各类困难。幸亏我们可以操纵软件模仿器来模仿硬件举行8086的进修理论。在《汇编说话》中作者举荐经过windows情况下的masmdebug举行进修。
masm先容:
  masm是一款DOS下的汇编工具包,在8086汇编的进修中我们需要其中的几个文件,别离是masm.exelink.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/158NKJoea6_Y4UmCFsDP0oQ#list/path=%2F)
  小我举荐第二种方式,下面先容若何在windows64位操纵系统下操纵DOSBox来搭建8086汇编说话的斥地情况。
DOSBox安装与操纵

DOSBox下载安装:
  DOSBox可以在官网下载,这里也供给了百度网盘的下载链接(0.74版本):https://pan.baidu.com/s/11_GcPpTqJm78N8xEXZpPMw
  安装终了后,找到安装目录下的DOSBox.exe并启动,能看到以下图界面。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200113150612000-267324495

  作为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了
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200113160826942-1555801574

增加自动实行剧本以制止反复操纵:
  由于上述DOSBox的磁盘挂载是临时的,每次重新启动DOSBox后都需要重新输入号令举行挂载,太贫苦了。我们可以经过点窜DOSBox设置的方式,免除这些反复的操纵。
  找到DOSBox安装目录下的DOSBox 0.74 Options.bat,操纵系统自带的记事本间接翻开,暂不研讨此外设置段的感化,找到末端的【autoexec】段,设置在【autoexec】的内容会作为号令在DOSBox启动时顺顺序被自动实行。  
  将挂载磁盘操纵号令设置在【autoexec】段中能制止反复操纵。点窜并保存设置文件后,重新启动DOSBox,发现设置中增加的号令会被自动实行。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200113155802271-1880645398

2. 8086debug形式先容

  在搭建好了8086汇编的斥地情况后,接下来先容8086的debug形式。实行debug.exe以进入debug调试形式,在dos中经过输入号令的方式举行交互。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200116100335770-1599765870

  debug形式下有20多种差别号令,限于篇幅这里只会先容几个今后实行经常用到的号令。(经过回车实行号令,DOS下的号令默许是不区分巨细写的)
R号令 检察/改变CPU寄存器内容

  R号令的感化是检察和点窜debug形式下CPU中寄存器的值。
  (-r) 零丁的输入r,可以检察当前CPU的内容
  (-r 寄存器名) r加上寄存器名可以在接下来的":"提醒后输入新的值,以到达点窜对应寄存器内容的目标(示例中第二行 AX 0000表现点窜前寄存器AX的值为0000)  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114103135732-425681616

D号令 检察内存中的内容

  D号令的感化是检察内存中的内容。
  D号令有很多差别的传参方式可供操纵,先先容最易明白的(段地址:偏移地址)检察方式。D号令默许会表现寻址地址起头的后128个内存单元的内容,以16进制的方式表现(每个内存单元8位,一行最多16个内存单元),而最右侧会将内存单元中的二进制数据以ascll码的形式翻译展现。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114111126375-72445047

  偶然,我们只想聚焦于某一部份内存地址的内容,而默许展现的内存视图不是很方便。
  D号令供给了此外一种拜候内存的方式(段地址:偏移肇端地址 偏移停止地址),其可以也许展现(段地址:偏移肇端地址 至 段地址:偏移停止地址)的内存信息,范围两头均为闭区间。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114112358699-199495588

E号令 改变内存中的内容

  E号令的感化是改变内存中的内容
  和对CPU中寄存器的检察,点窜差别,对内存举行检察和点窜较为复杂,为此debug计划了两个差别的号令别离举行控制(E号令点窜内存、D号令检察内存)。
  经过(E 肇端地址 数据1 数据2 数据3...)号令可以点窜内存中以肇端地址起头,顺序的N个内存单元的值(N为现实参数转达的数目)。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114150256970-602099052

  也可以和R号令点窜CPU中寄存器值类似的,经过提醒来点窜特定内存单元的值。00.12  00代表内存单元在点窜前的值,12是我们手动输入的、需要点窜的新值。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114150554709-1678552986

  可以经过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)。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114164544089-1540236314

U号令 将内存数据转换为汇编指令展现

  U号令的感化是将内存中的二进制数据转换为汇编指令展现(反汇编)。
  D号令可以也许将内存中的数据以16进制或ascll码的形式显现出来,但偶然我们需要观察的是内存中的呆板指令时,D号令的视图过于笼统,晦气于明白。debug供给了U号令来治理这个题目。
  对于前面我们在1000:0处输入的呆板指令,操纵 U 1000:0 号令(u 内存地址)可以将内存中的数据以汇编说话指令的方式举行展现。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114164603240-962681766

  可以观察到,左侧展现的是内存地址,中心则是16进制的内存视图,右侧展现的是内存中数据所对应的汇编指令(例如: 1000:0000B80100MOV AX,0001)。
  由于我们只输入了三条汇编指令,而背面内存中的数据并不是我们想要实行的,但U号令却仍然将其以汇编指令的形式转换并表现出来了。
  这也是前一篇博客所提到的,内存中的数据美尽是二进制的,既可以将其看做平常的二进制数据、十六进制数据、ascll码文本数据,也可以视作步伐指令,这些二进制的"数据"的处置惩罚完全取决于怎样对其举行表白
T号令 单步实行呆板指令

  T号令的感化是举行单步呆板指令的调试
  以上文经过E号令写入内存1000:0的三条指令举例,先容怎样操纵T号令来让CPU实行1000:0处的呆板指令。T号令用于单步伐试,一次只会实行一条呆板指令。
  8086CPU在运转时会将CS:IP寄存器所指向的内存单元中的内容表白为指令实行,要将内存1000:0处的内容作为指令实行必须先点窜CS、IP两个寄存器的值,使之指向1000:0。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114162509112-1390454254

  先实行一次T号令,1000:0处的指令(mov ax,0001)便会被实行,可以观察到寄存器ax的值已经酿成了0001;同时寄存器IP的值增加了3(mov ax,0001的指令长度为3),此时CS:IP指向的即是位于1000:3处的下一条指令(mov bx,0002),在视图的末端一行中也有所表现
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114165715534-2114789706

  再实行一次T号令,会实行1000:3处的指令(mov bx,0002),可以观察到寄存器bx的值酿成了0002;寄存器IP的值又增加了3(mov bx,0002的指令长度也是3),此时CS:IP指向的即是位于1000:6处的下一条指令(add ax,bx)
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114165736458-414419870

  末端实行一次T号令,add ax,bx会被实行(类似 ax=ax+bx)。寄存器ax的值已经酿成了之前寄存器ax和bx中的数据之和0003;寄存器IP的值增加了2(add ax,bx的指令长度是2),CS:IP指向1000:8。
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200114165811108-1604620347

A号令 以汇编指令的形式向内存中写入内容

  A号令可以也许以汇编指令的形式向内存中写入内容
  对于内存操纵,D号令可以检察内存中的内容,但假如想检察的是步伐指令,明显U号令加倍方便;E号令可以向内存中写入数据,但对于步伐指令的写入,间接操纵二进制呆板码的方式过于硬核。为此,debug供给了A号令,我们可以经过A号令以汇编指令的形式向内存中写入内容。
  经过A号令将(mov ax,0001,mov bx,0002,add ax,bx)三条指令写入内存1000:0处:
  
我的关键词 8086汇编说话进修(二) 8086汇编开辟情况搭建和Debug形式先容  热门消息 1506329-20200115102338136-1277069808

  经过A号令举行指令的写入,和E号令到达的结果一样,但操纵起来却加倍便利。A号令可以也许自动识别所输入汇编指令的长度,切确的在内存中写入步伐指令。
  debug供给了D、E两种号令用于对内存举行通用的操纵(纯二进制、十六进制数据的读、写)。
  对于步伐指令,debug供给了U、A两种号令以更人性化的方式来读写内存中的指令内容。
三 总结

  在debug形式下可以模仿8086汇编很是自在的控制CPU和内存,这也是汇编说话的强大之处和魅力地点。
切近硬件底层的编程可以也许让我们编写出来的步伐很是高效,但也存在一些题目:
  1.内存中的内容被当做指令照旧数据来处置惩罚完全取决于怎样表白,编程时稍有失慎就会致使CPU实行一些不应当实行的指令,甚至形成庞大的破坏。
  2.在未来还会先容怎样操纵汇编说话来实现高级说话中出现的结构体、数组等概念。这些数据结构美尽是步伐逻辑上的,内存自己可没有这些功用。是以在操纵汇编拜候内存中结构化的数据时,一不鉴戒就会出现内存拜候越界,错位等题目。
  3.汇编说话的笼统水平太低,很多在高级说话中很简单的功用在汇编中也需要很多的代码来实现(汇编实现的控制台打印hello world大如果常用说话中最烦琐的了)。
  编程说话的切近底层与呆板高效性假如站在更高的角度上看实在是一把双刃剑:间接操控底层的呆板方便,呆板实行服从高的同时,也是危险、斥地服从底下的。汇编说话步伐员不能不支出庞大的精神来细致思考、斟酌这些底层呆板层面的细节,以制止出现相关bug,大大低落了斥地服从。这也是高级说话诞生,并不竭成长的重要原因原由。
  高级说话大家属中按笼统水平来看,从偏底层的C,C++到java、python等,再到现在笼统水平最高的lisp。随着笼统水平的进步,离呆板底层越远,实行服从凡是也随之低落。但步伐员所需要斟酌的呆板细节也就越少,能更专注于营业逻辑,进而进步了斥地服从。比如在操纵C编程时还需要细致斟酌指针毛病,堆上无用内存采取等题目,到了更高级的java、python中,这些题目都交由编译器、虚拟机治理了,对斥地职员也几乎通明白。
  全国没有免费的午饭,在挑选得当的编程说话斥地步伐时,需要在呆板实行服从和斥地服从间做出取舍。但随着科学技术的成长,盘算机硬件会越来越强大,对呆板服从的担忧会越来越少,对步伐斥地服从的斟酌将占据主导职位,越来越多的步伐将会偏向于操纵笼统水平更高的编程说话举行斥地。
  固然需要操纵汇编说话的场所越来越少,但对汇编说话和底层呆板硬件有必定的了解的话,仍然可以也许帮助步伐员更深入的明白上层的常识内容、写出更高效的步伐。
  究竟,人类是没法笼统、封装到完竣无缺的,偶然照旧你需要跳进下水道,深入底层一探讨竟的。
  

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 淄博新闻网-淄博日报 淄博晚报 淄博财经新报 掌中淄博 淄博专业新闻资讯发布网站 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表