[TOC]
L4 第一个程序
源程序包含的内容
伪指令
伪指令由编译器来执行,没有实际的意义。
- segment与 ends:
功能是定义一个段
XXX segment
`
`
`
XXX ends
end:
汇编结束的标记assume:
将有特定用途的段和相关的段寄存器及窜起关联恰里。
源程序与程序
源程序:源程序文件中所有内容
程序:计算机执行,处理的指令或数据
编译与链接
用masm与link程序来用
masm 1.asm;//编译
link 1.obj;//链接
1.exe//执行
或
ml 1.asm;
谁将可执行文件中的程序装在进入内存并使它运行?
dos是一个单任务操作系统
在dos中,可执行文件中的程序p1要运行,必须有一个正在运行的程序p2,将p1从可执行文件中加载入内存,将CPU的控制权交给它,p1才能得以运行;当p1运行完毕后,应该将CPU的控制权交还给使它得以运行的p2。
cmd 其实是一个command.exe程序
在cmd中加载p1,然后程序返回。
command设置CPU的CS:IP指向程序的第一条指令。
程序返回:将CPU返回给加载他的程序
一个汇编程序从写到执行的过程
编程->1.asm->编译->1.obj->连接->1.exe->加载->运行->CPU
程序被装在内存的什么地方呢?
在dos中,exe加载过程
[图片上传失败...(image-23709c-1541149932450)]
1. 计算机会找到一段起始地址为SA:0000(即起始地址的偏移地址为0)的容量足够的空闲内存区
(不会怕内存不够大,因为cx已经加载了程序的大小)
cx 中储存的程序的长度 (000Fh->15个机器码)
2. 在这段内存区中前256个字节存放的是PSP;
PSP是dos用来和程序进行通讯的内容
3. 这段内存的256字节处开始(在PSP后),将程序装入,程序地址被设为SA+10H:0;
地址:
PSP区域:SA:0
程序区:SA+10H:0
(PSP区与程序区虽然物理地址连续,却有不同的段地址。)
4. 该内存的段地址存入ds中,出事话其他相关寄存器后,设置CS:IP指向程序入口
DS与IP相差0010H:0
即
DS = SA
CS = SA+10H
debug.exe中的指令
u:查看命令
u 0x21:0
u 0x21:0 256
t来执行指令
p来执行int 21(不用会跳到其他地方)
r可以用来改变
t
t
p
r ip
:0
附上一段汇编代码可以观察 ax,bx用pop,push
assume cs:codesg
codesg segment
mov ax,2000h
mov ss,ax
mov sp,0
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax,4c00h
int 21h
codesg ends
end