本文主要是介绍汇编语言03——第一个汇编程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
整理自鱼C论坛课件
汇编程序编写步骤
编写源代码->使用MASM.exe进行编译,产生目标文件->用LINK.exe,对目标文件进行链接,生成可执行文件
可执行文件中包含两部分内容
1,程序和数据
2,相关的描述信息(程序有多大,要占用多少内存空间等)
源程序:
assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00H
int 21H
abc ends
end
汇编指令:
有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。
源程序中:
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00H
int 21H
为汇编指令,会被编译为机器指令
伪指令
没有对应的机器码的指令,最终不被CPU所执行。
伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。
定义一个段
segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。
segment和ends的功能是定义一个段,segment说明一个段开始,ends 说明一个段结束。
一个段必须有一个名称来标识,使用格式为:
段名 segment
… …
段名 ends
一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。
一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。
end才是真正的没了
end 是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令 end,就结束对源程序的编译。
如果程序写完了,要在结尾处加上伪指令end 。否则,编译器在编译程序时,无法知道程序在何处结束。
切记:不要搞混了end和ends。
寄存器与段的关联假设
assume:含义为“假设”。
它假设某一段寄存器和程序中的某一个用 segment … ends 定义的段相关联。
通过assume说明这种关联,在需要的情况下 ,编译程序可以将段寄存器和某一个具体的段相联系。
汇编源程序:
伪指令 (编译器处理)
汇编指令(编译为机器码)
程序:源程序中最终由计算机执行、处理的指令或数据。
注意
我们可以将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行处理的指令或数据 ,成为程序。
程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。
请看图!
源程序:
标号:
一个标号指代了一个地址。
codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。
程序返回
我们的程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中,那么,它怎样得到运行呢?
DOS中的程序运行
DOS是一个单任务操作系统。一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才能得以运行。
P2开始运行后,P1暂停运行。而当P2运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P1,此后,P1继续运行。
现在,我们知道,一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。
最后如何返回呢?
应该在程序的末尾添加返回的程序段。
mov ax,4c00H
int 21H
这两条指令所实现的功能就是程序返回。
知识扩充:
操作系统的外壳
操作系统是由多个功能模块组成的庞大 、复杂的软件系统。任何通用的操作系统 ,都要提供一个称为shell(外壳)的程序 ,用户(操作人员)使用这个程序来操作计算机系统工作。
DOS中有一个程序command.com ,这个程序在 DOS 中称为命令解释器,也就是DOS系统的shell。
(1)我们在DOS中直接执行 1.exe 时,是正在运行的command将1.exe中的程序加载入内存。
(2)command设置CPU的CS:IP指向程序的第一条指令(即程序的入口),从而使程序得以运行。
(3)程序运行结束后,返回到command中,CPU继续运行command。
关于如何在64位操作系统上进行编译链接:
首先,需要下载debug.exe,DOSbox,masm
假如汇编源文件放在:D:\Develop\ASM_Program\first_asm\下,文件名为1.asm
下载一个masm6.15,将MASM.EXE,LINK.EXE,ML.EXE三个文件复制到1.asm目录中,
1.asm内容:(求2^3)
assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00H
int 21H
abc ends
end
win+R,输入cmd
进入命令行,输入
C:\Users\Administrator>D:
D:\>cd Develop\ASM_Program\first_asm
至此,进入了源程序所在目录,之后,输入:
D:\Develop\ASM_Program\first_asm>masm 1.asm
会显示:
Microsoft (R) MASM Compatibility Driver
Copyright (C) Microsoft Corp 1993. All rights reserved.
Invoking: ML.EXE /I. /Zm /c /Ta 1.asm
Microsoft (R) Macro Assembler Version 6.15.8803
Patched for you by promethee [ECL] in the year 2001 - enjoy
Copyright (C) Microsoft Corp 1981-2000. All rights reserved.
Assembling: 1.asm
D:\Develop\ASM_Program\first_asm>
这样,程序就被编译好了,在1.asm文件夹下出现了一个1.obj的文件
之后,再输入:
link 1.obj之后回车
会显示链接信息:
Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.
Run File [1.exe]: //显示这个之后需要按下回车之后才出现下一行
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment
LINK : warning L4038: program has no starting address
这样,就生成了1.exe文件,即可执行文件
但是由于操作系统是64位的,不能直接运行这个文件,所以,需要使用DOSbox进行运行
我们先把下载下来的debug.exe也放到D:\Develop\ASM_Program\first_asm下面
打开DOSbox,输入:
mount c d:\Develop\ASM_Program\first_asm\
之后,输入c:
然后输入debug 1.exe
就使用debug打开了1.exe了
可以输入r命令查看当前寄存器的状态,在我的机器上状态如下:
CX寄存器中记录了程序的大小
输入t命令进行单步执行
注意,执行到最后一句int 21时,要使用p命令执行
这篇关于汇编语言03——第一个汇编程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!