#pragma once
/* 21-第一个程序02
源程序
标号
一个标号指代了一个地址。 (相当于其他语言的指针)
codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。 (被编译后,标号会变成一个唯一的地址来指向该段,类似 windows 中的句柄)
程序的结构 汇编程序
任务:编程运算 2^3。 assume cs:abc // cs 段寄存器与 abc 标号段连接 ,表示该段是一个 代码段!!! 下面的abc 就会被处理成一个代码段的地址,意思就是该标号的段用于哪个类型的段寄存器
abc segment // 定义一个段的标号
定义一个段 mov ax,2 // 汇编代码
实现处理任务 add ax,ax // 汇编代码
程序结束 add ax,ax // 汇编代码
段与段寄存器关联 abc ends // 该标号段结束
end // 结束程序
程序返回
我们的程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中,那么,它怎样得到运行呢?(讨论)
现在,我们知道,一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。
如何返回呢?
DOS中的程序运行
DOS是一个单任务操作系统。
一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才能得以运行。P2开始运行后,P1暂停运行。
而当P2运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P1,此后,P1继续运行。
就向 在驾校学开车一样, 车只有一辆,但是学员有很多,我学习的时候,其他人在边上等着,其他人如果想学习,就需要我停下来,把车子让给别人,让其他人学习,这个时候我的学习进度暂停了,其他人学习完毕轮到我了,我
继续学习.
源程序
程序返回
应该在程序的末尾添加返回的程序段。
mov ax,4c00H
int 21H // int 可不是整形,是中断标志
这两条指令所实现的功能就是程序返回。
几个和结束相关的内容 - - >>
段结束、程序结束、程序返回
目的 相关指令 指令性质 指令执行者
通知编译器一个段结束 段名 ends 伪指令 编译时,由编译器执行
通知编译器程序结束 end 伪指令 编译时,由编译器执行
程序返回 mov ax,4c00H 汇编指令 编译时,由CPU执行
int 21
语法错误和逻辑错误
语法错误
程序在编译时被编译器发现的错误;
容易发现。
aume cs:abc // assume 写错
abc segment
mov ax,2
add ax,ax
add ax,ax // 没有 adc ends
end
逻辑错误是程序在编译时不能表现出来的、在运行时发生的错误;不容易发现。
编辑源程序
assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00H // 返回代码
int 21H
abc ends
end
创建一个1.asm 的文件,将上面代码写入.
上鸡(机)!!
一般来说,有两类错误使我们得不到所期望的目标文件:
(1)我们程序中有“Severe Errors”; “Severe Errors” 一些严重错误的意思,就是很多严重错误..
(2)找不到所给出的源程序文件。
在dos 系统中,我们最好将要编译的源文件 和 MASM.EXE LINK.EXE ML.EXE DOSXNT 这4个文件放在同一个目录,然后我们进入该目录,使用:
masm 源文件.asm 进行编译 编译后会生成一个 .obj 后缀的文件,此文件是二进制文件,也就是把源程序文件 编译成了 机器码,加入了一些其他信息,然后使用
link 文件名.obj 进行连接,生成一个可执行的 .exe 后缀的文件,此文件就是可以执行的文件.
1.exe的执行
我们的程序没有像显示器输出任何信息。程序只是做了一些将数据送入寄存器和加法的操作,而这些事情,我们不可能从显示屏上看出来。
程序执行完成后,返回,屏幕上再次出现操作系统的提示符。
以简化的方式进行编译和连接
; 符号 可以让我们简化的直接进行编译 和链接, 不需要确定中间很多的参数
例如 masm 源文件.asm;
link 文件名.obj;
ML 文件是 MASM 和 Link 文件的缩写组合, 也就是说,直接编译 + 连接.
关于编译和链接
编译连和接的作用是什么呢?
连接的作用有以下几个:
当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;
程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;
一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这此内容处理为最终的可执行信息。
所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。
注意,对于连接的过程,可执行文件是我们要得到的最终结果。
强调!!
这里再次强调一下,我们学习汇编的主要目的,就是通过用汇编语言进行编程而深入地理解计算机底层的基本工作机理,达到可以随心所欲地控制计算机的目的。
我们用汇编语言编程,就要用到 :编辑器(Edit)、编译器(masm)、连接器(link)、调试工具(debug)等所有工具,而这些工具都是在操作系统之上运行的程序,所以我们的学习过程必须在操作系统的环境中进行。
*/