第一个汇编程序

前面所学习的Debug的用法,但并不是一个完整的程序
对于汇编程序
由源程序文件到可执行文件:
源程序文件(.asm)——>目标文件(*.obj)——>(链接)可执行文件(.exe)
在这里插入图片描述有上面这图我们来分析

源程序

在汇编语言的程序中有两种指令

  • 伪指令
  • 汇编指令

伪指令:由编译器执行
汇编指令:对应的机器码,被编译为机器码,被CPU执行

具体分析:
(1)segment和ends是一对成对使用的伪指令
这是在写可被编译的汇编程序时,必须用到的一对伪指令
其功能是定义一个段
segment 说明段开始
ends 说明段结束
格式:
段名 segment

段名 ends

(2)end
end是一个汇编程序的结束标记,,告诉编译器我们写完了
就结束编译
注意:区别上面的ends!!
(3)assume(假设)
它假设某一段寄存器和程序中的某一个segment…ends的定义的段相关联
就如上图中,assume cs:codesg
将用作代码段的段codesg和CPU中的段寄存器 cs联系起来

(4)mov ax,0123…
这一段就是汇编指令
里面的内容不做解释

(5) mov ax,4c00 int 21
这是一个程序返回

这里解释一下我们写的程序怎么得到运行的:
在DOS基础上,一个程序P2在可执行文件中,在之前必须有一个正在运行的P1文件
将P2从可执行文件中加载入内存,将CPU的控制权交给P2,让P2得到运行。当P2运行完成后,就需要我们将控制权交还给P1,然后P1继续运行

所以这就为什么要写这个代码的原因!!
当然现在我们只需要记住末尾要加入这两条指令

最后如果在编写程序时,存在语法错误,这样的错误是很容易发现的,编译器会提醒我们哪里有问题,而逻辑错误不易发现。

编辑源程序

在编辑源程序时我们用DOS提供的Edit
当然也可以用其他的,比如记事本
VC++

这里我使用的就是Edit
将写完的程序进行保存并,命名,尾部一定要加上*.asm
保存后我们就会看到在此目录下我们保存的1.asm的源程序文件
在这里插入图片描述

编译

由上述我们已经生了源程序文件(1.asm),现在我们要做的是生成目标文件
这里我们已经下载好了编译器(masm.exe)那么我们直接在DOX上面运行就好了
在这里插入图片描述
在masm后面输入要编译的源程序文件即可,这里默认文件就是asm,所以我们在输入时其实可以不用后面加上asm,但注意如果你的源程序时txt文件,那么你就要加上*.txt

除此之外,如输入源程序要指明路径,如果文件就在当下的路径就不需要,只用输入文件名就可以,但如果文件在其他的目录中,则要输入路径
ag:
编译文件在c:\winddows\desktop下,就需要输入c:\winddows\desktop\p1.txt

(1)在我们运行masm后就会出现上图的样子
首先出现信息是说明这个编译器的版本
第四行就是生成的目标文件
这里我们可以输入名字,也可以不用输入
在这里插入图片描述
(2)上图中紧接着出现的两行,分别时列表文件(*.LST)和交叉引用文件( *.CRF)
这是生成目标文件的中间文件,这里我们先忽略
由上图我们还可以看到我们这个文件并没有生成,有错误
上面说我们没有定义END
这里我们修改一下
后面还是生成了
在这里插入图片描述在这里插入图片描述注意:如果不想这么繁琐,我们可以在masm 1后面加一个分号,就会跳过这些步骤直接生成,同下面的连接一样

连接

连接的目的就是生成可执行文件
与上述生成目标文件的方式极为类似,就是这里我们用的工具时link工具
我们已经下载好了,直接用
在这里插入图片描述操作方式跟masm一样
这里解释一下
映像文件(*.MAP)
库文件(.LIB)
这都是生成的中间文件
而no stack segment 表示说没有栈段,我们知道栈的危险,这里我们先忽略
库文件可以将子程序链接起来,调用库中的文件与目标文件联系在一起生成可执行文件,在后面我们会了解到
在这里插入图片描述
最后这是我们生成的可执行文件

1.exe的执行

在这里插入图片描述这里我们执行了1.exe文件,奇怪的是,没有返回任何显示
但这里程序是运行了
原因是我们的程序根本没有向显示器输出任何信息,所以不会看到,后面会讲解到

程序执行过程和追踪

这里我们用Debug对程序进行追踪
在上面我们在说程序返回时,我们讲述了原因,
而对于执行P1其实就是command,当然现在的是cmd
如果不用Debug追踪,要直接执行,就用command,但这样我们就看不到是否执行了
所以我们用Command先去执行Debug,然后用Debug去执行1.exe的文件
在这里插入图片描述我们观察这副图,DS=075A,CS=076A,CX=000F
这里
CX存放的是程序的长度,1.exe中的机器码共有15个字节
所以是F(十六进制)
现在程序已经从1.exe中装入内存,接下来查看一下它的内容,可是我们查看哪里的呢容呢?
程序被装入了内存的什么地方?
我们怎么知道?
DOS首先找到一段起始地址,就是DS,在起始地址留出256Bit
创建一个PSP的数据区
CS的地址则在DS+10H,根据我们前面学过的物理地址知道,段地址是要X16的,那么10H*10H(16)为100H
而100H0-255就是256个 Bit
这里的知识与操作系统有关,对于学习汇编语言我们只需要知道就好了

补充

  • P命令:继续命令 类似T命令,逐条执行指令,显示结果,但遇到子程序、中断程序时直接执行然后显示结果
  • G命令:运行命令,从指定地址处开始运行程序,直到遇到断点或者程序正常结束

记住用使用P命令执行int 21
至于原因,先不必考虑
要退出Debug用Q命令

执行

在这里插入图片描述在这里插入图片描述

这里我们再查看psp中的内容

在这里插入图片描述有点东西

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Back~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值