汇编语言实验三

(一)将下面的程序保存为 t1.axm 文件,将其生成为可执行文件 t1.exe
assume cs:codesg

codesg segment

    mov  ax,2000H
    mov  ss,ax
    mov  sp,0
    add  sp,10
    pop  ax
    pop  bx
    push ax
    push bx
    pop  ax
    pop  bx

    mov ax,4c00H
    int    21H

codesg ends

end

(1)编辑

(2)编译

完成对源程序的编辑后,得到一个源程序文件 c:\ASM\t1.asm。可以对其进行编译,生成包含机器代码的目标文件

使用汇编编译器 masm 来完成编译任务。

(3)连接

可以看到经过编辑、编译、连接 3 个步骤后,当前文件夹下总共有 3 个文件,它们分别是:

  • T1.ASM
  • T1.OBJ
  • T1.EXE

其中 T1.EXE 是一个可执行文件,也就是我们最终想要得到的文件。

(二)用 Debug 跟踪 t1.exe 的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容

下面说一说 DOS 中一个 EXE 文件被加载进内存的过程。

一个程序被加载进内存后,操作系统会为我们创建一个程序段前缀(PSP),DOS 需要通过 PSP 来和我们的程序进行通信,其中 PSP 和我们的程序在内存中的关系图大致如下:

程序加载后,DS 中存放着程序所在内存区的段地址,由于 PSP 也是程序在内存中的一部分,所以 DS = SA。

而 CS 是指向程序的第一条指令,CS = DS + 10H,通过上面动图里寄存器的内容也能看出来。DS = 0A67H,CS = 0A77H。

所以我们也可以说,通过 Dubug 命令,将这段程序从可执行文件中载入内存,程序起始地址为 0A67H,第一条指令起始地址为 0A77H,其中 0A67H ~ 0A77H 这段地址存放的是该程序对应的程序段前缀(PSP)。

程序从 0A77:0000 开始执行如下:

(三)PSP 的头两个字节是 CD 20,用 Debug 加载 t1.exe,查看 PSP 中的内容。

0A67:0000 ~ 0A67:0100 这段内容就是程序段前缀(PSP)里的内容。

posted @ 2018-11-17 16:41  driveby  阅读(428)  评论(0编辑  收藏  举报