开始的时候有点畏惧写汇编的程序,因为汇编的程序有太多的指令需要记忆了,同时这个语言有点让人难以理解,但是经过我的一番复习之后,发现其实也并不是那么难,正所谓说:只要下功夫,没有事是不能成功的。
由于是第一次写我自己的汇编程序,所以今次我特别详细的写下的编程过程。
我的整个开发过程如下:
首先要理解汇编编程的过程:一,建立.asm文件,将masm.exe,debug.exe,link.exe复制到与源程序同一个文件目录下。打开.asm文件,在里面编写好程序 二,编写好程序之后,要检查程序有没有问题,这里要打开dos界面,进行对程序编译,cd是打开文件夹的意思,masm命令就是用来编译文件了,我建立的是1.asm文件,所以直接打上masm 1.asm就可以编译了,假如有错误系统与直接提示错误的地方和行,根据提示就可以进行修改了。三,link 1.obj就可以生成.exe文件了。直接运行exe文件文件就可以看到你所需要的结果,例如本实验就是显示字符串了。
讲完如何进行汇编写程序,编译程序和生成可执行文件,下面我来讲讲汇编程序具体怎么写,其实写汇编程序有一定的格式,这些格式一般都是固定的不需要修改直接套用就可以了。
汇编的一些固定格式:
;sample program display message;注释行
stack segment para stack'stack';定义堆栈段
db 1024 dup(0) ;在存储器的某个区域建立一个堆栈区
stack ends
data segment ;定义数据段
message db'This is a sample program.' ;在存储器中存放供显示的数据
db 0dh,0ah,'$'
data ends
code segment ;定义代码段
assume cs:code,ds:data,ss:stack
start proc far ;将程序定义为远过程 程序开始
。。。。。。。。。。。。。。。。。。。。
start endp ;程序结束
code ends ;代码结束
end start
首先我们来分析这一代码段,一目了然,首先我们定义堆栈段
就是
stack segment para stack'stack';定义堆栈段
db 1024 dup(0) ;在存储器的某个区域建立一个堆栈区
stack ends
这里建立了一个1024字的堆栈段
其次是定义数据段,用来存放数据
data segment ;定义数据段
message db'This is a sample program.' ;在存储器中存放供显示的数据
db 0dh,0ah,'$'
data ends
这里用来存放要显示的内容'This is a sample program’
最后我们要定义代码段:
code segment ;定义代码段
assume cs:code,ds:data,ss:stack
这里将所有的数据与段寄存器一一对应起来了,cs对应code,ds对应data,ss对应stack。正所谓:各司其职呀。
最最后就是程序结束啦,告诉系统我要结束了
start endp ;程序结束
code ends ;代码结束
end start
中间部分就是程序核心部分了,
但是里面还是有一些固定格式需要注意的,就是
start proc far ;将程序定义为远过程 程序开始
push ds ;固定格式
mov ax,0
push ax ;标准序,以便返回dos操作系统
mov ax,data ;建立数据段的可寻地址性,固定格式
mov ds,ax ;初始化ds,固定格式
lea bx,message ;message地址偏移量-》bx,固定格式
这一段程序开始之后我们有一段标准序,这一段的用处就是让程序方便返回到dos系统中
标准序如下:
start proc far ;将程序定义为远过程 程序开始
push ds ;固定格式
mov ax,0
push ax ;标准序,以便返回dos操作系统
其后就是我们要对数据段进行操作的话,我们要他提取出来就是下面的程序:
mov ax,data ;建立数据段的可寻地址性,固定格式
mov ds,ax ;初始化ds,固定格式
lea bx,message ;message地址偏移量-》bx,固定格式
这段程序就是将data中的数据放在ds段里面,用bx来读出message的地址偏移量。
这样我们就完成了对程序系统的初始化,可以大展身手的去编写自己需要的程序了。我们需要实现的功能是显示字符串,具体程序如下
loop1:cmp byte ptr[bx],'$' ;比较字符是否等于$
je loop2 ;是的话就跳转到loop2
mov ah,2 ;2号dos功能调用输出字符,固定格式
mov dl,[bx];将所要的打印的字符输给dl
int 21h ;dos系统功能
inc bx ;bx自加一,指向下一个字符
jmp loop1 ;无条件跳转到loop1
loop2:ret ;返回dos系统
我们建立两个需要,一个不断的循环显示字符,一个就是返回dos系统
分析程序如下:比较第dx位的数据是否等于‘$’结束符,结束的话就跳转到loop2,返回dos
没有结束的话就调用2号dos系统功能,将需要显示的字符赋给dl,执行功能就完成了一个显示,再然后对bx自加1 ,跳转loop1不断循环就可以了。
整体程序如下:
;sample program display message;注释行
stack segment para stack'stack';定义堆栈段
db 1024 dup(0) ;在存储器的某个区域建立一个堆栈区
stack ends
data segment ;定义数据段
message db'This is a sample program.' ;在存储器中存放供显示的数据
db 0dh,0ah,'$'
data ends
code segment ;定义代码段
assume cs:code,ds:data,ss:stack
start proc far ;将程序定义为远过程 程序开始
push ds ;固定格式
mov ax,0
push ax ;标准序,以便返回dos操作系统
mov ax,data ;建立数据段的可寻地址性,固定格式
mov ds,ax ;初始化ds,固定格式
lea bx,message ;message地址偏移量-》bx,固定格式
loop1:cmp byte ptr[bx],'$' ;比较字符是否等于$
je loop2 ;是的话就跳转到loop2
mov ah,2 ;2号dos功能调用输出字符,固定格式
mov dl,[bx];将所要的打印的字符输给dl
int 21h ;dos系统功能
inc bx ;bx自加一,指向下一个字符
jmp loop1 ;无条件跳转到loop1
loop2:ret ;返回dos系统
start endp ;程序结束
code ends ;代码结束
end start
显示结果是:
This is a sample program.
与预想结果一致,完成了整个实验。
汇编实验感想,感觉汇编编程还是挺好玩的。希望以后能写出些好玩的程序。在这里不多说了。
今天到此为止。
用户377235 2013-6-21 12:42