过程:
-
编写源代码
-
编译链接源代码生成可执行文件,可执行文件包含两部分内容
程序和数据、相关描述信息
源程序
汇编指令
伪指令:指令没有对应的机器码,由编译器识别和执行
定义一个段
一个汇编程序有多个段组成,这些段用来存放代码,数据或当做栈空间来使用。
一个有意义的汇编程序至少用一个代码段
]
segment和ends:
segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪令。segment和ends的功能是定义一个段,segment表示一个段的开始,ends说明一个段的结束,一个端必须有一个名称来标识,使用格式为:段名 segment以及段名 ends
end:汇编程序的结束,编译器检测会结束编译,这是一个伪指令
assume:
指定自定义的段名字对应的段类型(数据段、代码段等)
源程序中的程序:
源程序:源程序文件中的所有内容称为源程序
程序:最终由计算机执行处理的指令或者数据,称为程序,也就是汇编指令,不包含伪指令
标号
一个标号指代了一个地址
比如上面图的codesg
就会编译成一个地址
程序的返回:
一个dos命令窗口可以看做是一个单线运行的程序,当运行.exe
文件的时候,首先dos程序会被挂起,然后进入到用户运行的程序,运行用户代码,运行后不能卡死在用户代码中,必须提供程序的返回机制,也就是继续刚刚被挂起的dos程序。通过下面的代码:
mov ax,4c00H
int 21H
这段代码使得程序运行完之后返回到原来的位置
assume cs:codesg
codesg segment
start://入口标号,名字可以所以,编译器会根据end后面的值确定
mov ax, 0123H
mov bx, 0456H
add ax, bx
add ax, ax
mov ax,4c00h
int 21h
codesg ends
end start
程序的运行过程
]
- 操作系统会在内存中为运行的程序分配足量的内存空间
- 这段内存空间中的,代码段寄存器偏移数据段寄存器
10H
,段寄存器数值偏移10H
实际上对应到物理地址就是100H
(因为在寻址的过程中实际地址=段地址*16+偏移地址),也就是十进制下相隔了256字节,这里用于存储程程序的前缀PSP
,在运行的过程中dos会通过这一段空间中的程序进行通信。 - 我们的程序指令会在代码段寄存器偏移0处【段寄存器:0】开始记录