对于每一本编程书,这样的标题似乎都会令人感到振奋。。
特别对于一个编程小白来说,尤其振奋。
心里一定是这样想的:“天天看周围的编程大佬在那装逼,今天终于要出一口气了,我也要会写程序了!”
那么就让我们带着这样的心情去看这一章吧!(虽然我可能已经没有这样的心情了)
先讲一下整个过程:编写汇编源程序->对源程序进行编译->执行可执行文件中的程序
就是这么简单。
下面让我们细细地来看一下。
我们先来讲一下源程序。
先贴一段代码:
assume cs:codesg
codesg segment
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00H
int 21H
codesg ends
end
看不懂?别急!别让问题压倒你!我们下面就解释。
首先,在汇编语言中有两种指令,一种是汇编指令,另一种是伪指令。
在上面的程序中出现了三种伪指令。
(1)XXX segment……XXX ends
这两个是成对的。
它们的功能是定义一个段,segment说明的是段的开始,ends说明的是一个段的结束,而XXX则是段的名称。
一个有意义的汇编程序至少有一个存放代码的段。
(2)end
end是汇编程序的结束标记,也就是说这个标记是告诉编译器,这个程序已经编译结束了
(3)assume
这个单词的中文意思是假设。
这个指令是假设某一段寄存器和程序中的某一个用segment……ends定义的段相关联。
比如,这里的codesg是一个代码段,所以一定与cs相关。
那么除了伪指令,剩下的就是汇编指令,想必有了前面的学习,大部分的代码大家都能看懂了,但是,可能有疑惑的就是最后的那一个“int 21H”
那么这是什么意思呢?
其实,这里是为了实现程序返回,也就是说程序P1启动P2后,当P2运行结束后,P2需要将控制权再交回给P1,所以最后的两个指令:
mov ax,4c00H
int 21H
这两个指令就是为了程序返回。
那么为什么这个能实现程序返回呢?
这个呢?现阶段,我们暂时不需要知道,我们只要知道这个代码可以实现程序返回就行了。
我们会在以后学到相应的知识后,再讲这个知识点。
编译与运行
下面我们来讲讲具体应该怎么去写程序并编译运行。
首先我们得写程序。
用什么写呢?
你可以选择用notepad(记事本)或者是edit,最后保存为X.asm即可。
这里给个有用的提示,那就是如何用edit。
首先,什么是edit?
就是Windows自带的一个编辑器。
那么怎么用呢?
打开DOS,输入edit,按回车就行了。
看起来好像很简单。
但是当你信心满满地去尝试的时候,你可能会发现,咦?为什么我的不行?
好像总弹出一个窗口,上面写着“NTVDM”和“句柄”啥的,好像很复杂,该怎么解决呢?
首先,按如下操作:
控制面板->程序和功能->启动或关闭Windows功能->旧版组件->勾选“NTVDM”->确定
这一步只是确保你的这个组件是开着的。
此时你可以再试一下,如果可以了,就很好,如果还不行,那么我们就实行第二步。
打开DOS->右击标题栏->属性->勾选“使用旧版控制台”->确定->重启即可
这样的话你就可以进入edit了。
好,现在我们将前面讲的程序输入进去,保存好。
现在我们用masm去编译我们的源程序。
首先,下载对应的程序,这个自行百度“masm”,我们使用masm的时候,还是在DOS中使用。也就是说我们把masm当做一个外部命令使用。
我们在DOS中输入:
masm 【对应的文件路径(不加后缀)】;
这样我们就可以得到一个X.obj
这样我们就完成了编译的环节,接下来我们需要进行连接。
如何连接?
这就需要我们用link来完成,我们在DOS中输入如下命令:
link 【对应的文件路径(不加后缀)】;
这里的文件路径是指我们刚刚编译得到的X.obj,这样我们就可以得到我们最终的程序——X.exe。
这时候我们就可以执行这个可执行文件了。
但是,你不会看到任何结果,因为这个程序并没有向屏幕输出任何结果,所以不要太奇怪。
那么我们如何去调试我们的程序呢?
因为有的小错误是很容易被检查出来的,但是一些隐藏较深的逻辑错误,就不容易被检查出来,这是我们就需要去调试。
你可能会想起我们之前讲过的debug,没错,我们这里就要把debug搬上舞台了,我们只需要在DOS中输入:
debug 【可执行文件路径(加exe)】
这样我们就可以去调试我们的程序,怎么调试的我就不详述了。
当然了,我们也可以先输入masm,link,然后再输入文件名(不要扩展名)
exe加载过程
第四章就这样了!