第四节:第一个程序
1. 一个源程序从写出到执行的过程:
第一步:编写汇编源程序
第二步:对源程序进行编译连接,产生可在操作系统中直接运行的可执行文件。
可执行文件包含两部分内容: 程序和数据,相关的描述信息
第三步:执行可执行文件中的程序
2. 源程序:
Eg:
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. 伪指令:xxxsegment xxx ends
Segment ends 成对使用的伪指令,在中间存放代码
2. end:汇编程序结束标记
3. Assume:假设 假设某一段寄存器和程序中的某一个用segment...ends定义的段相关联。
比如上面就是 用assume cs:codesg将用作代码段的codesh和CPU中的段寄存器CS联系
4. 标号 codesg 一个标号指代了一个地址,作为一个段的名称,这个段的名称最终被编 译,连接程序处理为一个段的段地址。
5. 程序返回:程序末尾使用这两条指令实现程序返回mov ax,4c00H int 21H
3. 汇编程序从写出到执行的过程:
编程->1.asm->编译->1.obj->连接->1.exe->加载->内存中的程序->运行
(Edit) (masm) (link) (command) (CPU)
由于本人电脑为64位,不兼容不能运行DOSBOX,也懒得下XP的镜像,所以代码就没有敲
4. 程序执行过程的跟踪:
当CS:IP一指向程序的入口,command就放弃了CPU的控制权,CPU立即开始运行程序
使用Debug可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug不放弃对CPU的控制。
CX中存放的是程序的长度。
在内存的程序运行之前有一段PSP(SA:0)段,256字节,程序的物理地址是:SA+10H:0
如何计算程序地址?
Eg:DS=129E,则PSP=129E:0 程序地址为12AE:0(即129E+10:0)
(-p 命令执行int 21H)