实验3 编程、编译、连接、跟踪

四、实验结论

练习一:

(1)编写汇编源程序 t1.asm;

assume  cs:code
code segment
    mov ah,2
    mov dl,6
    add al,30h
    int 21h
    
    mov ah,2
    mov dl,5
    add dl,30
    int 21h

    mov ah,4ch
    int 21h
code ends
end

 (2)对源程序 t1.asm 进行汇编、连接、运行、调试;

step1:编译;

step2:连接;

step3:运行;

以上step1~step3均直接在进入dosbox之后执行;


 

如果将代码中两次给dl赋值的值改变,例如变为6和5,则运行之后会出现如下的结果:

由此可以猜测:给dl赋的值会导致运行后出现不同的图标,每一个图标的形状应该和dl寄存器中的值有关;

注:我将t1.asm文件存放在与有link.exe和masm.exe的目录下


以下操作是进入debug环境进行调试的:

(1)在debug中运行t1.exe文件并查看当前各个寄存器中的值;

我们可以观察到CX中此时存储的值是0015,则说明当前代码的长度是15;

(2)我们通过u命令进行反汇编,此时的代码是从当前CS和IP所指向的位置开始写入的(???此处不是很确定),所以我们应该从当前CS:IP指向的位置开始查看内存中的机器码以及反汇编之后得到的汇编指令。因为代码段的长度为15,但是初始地址是从0开始的,所以我们只需要查看偏移地址从0~14的内存空间。

(3)由于此时CS:IP指向的就是当前代码段的起始位置,所以直接用t命令执行;

此时我们看到下一条即将执行int 21这条命令,所以接下来用p命令执行;

此时出现了图案;


 

倘若此时还是用t命令执行,会出现以下情况,会发现下面要执行的命令不是我们所预期的;


 所以,我发现只要下一条命令是int 21,就用p命令执行,其他都可以用t命令执行;


 

在单部调试过程中,DS和CS寄存器中的关系始终满足:CS=DS+10;

验证PSP(程序段前缀)的头两个字节是 CD 20:


 

练习2:

(1)编写汇编源程序 t2.asm;

assume cs:code
code segment
    mov ax,0b800h
    mov ds,ax

    mov bx,0
    mov [bx],0433h
    
    add bx,2
    mov [bx],0436h

    mov ax,4c00h
    int 21h
code ends
end

 

(2)对源程序 t2.asm 进行汇编、连接、运行、调试;

  • 运行程序,没有出现预期的红色数字36;

  • 在执行t2.exe文件之前进行cls操作之后;

  • 将源代码中 line7 的 0433h→0432h, line10 的 0436h→0439h, 然后重新汇编、连接,得到可执行文件 t2.exe。使用 cls 命令清 屏后,再次观察程序运行结果。

  • 试将源代码中 line7 的 0433h→0333h, line10 的 0436h→0336h, 然后重新汇编、连接,得到可执行文件 t2.exe。


 

在使用debug调试t2.exe文件的时候,我们进行单部调试;

在执行完mov [bx],0433之后,已知这条语句和mov [0],0433等效;查看ds:0这段内存空间;发现没有将0433存入内存中!!!(已解决)

同样的,mov [bx],0436执行之后,以ds:2开始的内存中也没有被存入数据,不知道原因是什么???(已解决)

最后程序正常结束:


 

Solution:

  • mov [bx],0433h和mov [bx],0436h都是无效指令,mov指令不支持将数据直接送入内存单元
  • 就我目前所知道的实现数值显示有两种方法:(1)用int 21中断(2)加数据写入显存中

 

posted @ 2018-11-15 17:41  Sun-Yiwen  阅读(195)  评论(0编辑  收藏  举报