zoukankan      html  css  js  c++  java
  • 实验5 编写、调试具有多个段的程序

    四、实验结论:

    任务一:

    (1)对源程序 ex5_1.asm 进行汇编、连接、运行;

    (2)利用debug来对源程序进行调试;

    step1:用r命令查看当前的各个寄存器的值;

    step2:根据当前CS的值并且用u命令进行反汇编;

    step3:根据反汇编得到的结果,用g命令执行到程序返回前,即执行到001D之前;

    因此,可以知道此时(即程序返回前):

    CS=076C

    SS=076B

    DS=076A

     step4:因为已经将data的值传进了ax中,所以查看data段中的数据;

    (3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1;


     任务二:

    (1)程序返回前,data段中的数据为:

    (2)根据反汇编得到的结果,用g命令执行到程序返回前,即执行到001D之前;

    CS=076C

    SS=076B

    DS=076A

    (3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1;

    (4)该段实际占有的空间为:(N/16+1)*16

       注:在8086CPU架构上,段是以paragraph(16-byte)对齐的。程序默认以16字节为边界对齐,所以不足16字节的部分数据也要填够16字节。“对齐”是alignment,这种填充叫做padding。16字节成一小段,称为节。

    任务三:

    (1)程序返回前,data段中的数据为:

    (2)根据反汇编得到的结果,用g命令执行到程序返回前,即执行到001D之前;

    CS=076A

    SS=076E

    DS=076D

    (3)设程序加载后,code段的段地址为X,则data段的段地址为X+2,stack段的段地址为X+4;


     任务四:

    第(1)和(2)个程序不能执行,因为找不到程序入口就无法执行第一条语句;


    任务五:

    源代码:

    assume cs:code
    a segment
      db 1,2,3,4,5,6,7,8
    a ends
    
    b segment
      db 1,2,3,4,5,6,7,8
    b ends
    
    c segment  
      db 8 dup(0)
    c ends       
    code segment
    start:
      mov bx,0
      mov dx,0
      mov cx,8
    s:mov dx,0
      mov ax,a
      mov ds,ax
      add dl,[bx]
      mov ax,b
      mov ds,ax
      add dl,[bx]
      mov ax,c
      mov ds,ax
      mov [bx],dl
      inc bx
      loop s
      mov ax,4c00h
      int 21h
    
    code ends
    end start

    step1:利用t命令单部执行到mov [bx],dl命令之前,此时上一条命令mov ds,ax已经执行完毕,此时ds中保存的就是c段的段地址

    step2:用d命令查看未加载数据之前的c段中的内容

     

    step3:运行到程序返回前,此时的DS中保留的就是c段的段地址,查看c段中的数据;

    Conclusion:验证得知,数据得到了相加。


     任务六:

    源代码:

    assume cs:code
    a segment
      dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
    a ends
    
    b segment
      dw 8 dup(0)
    b ends
    
    code segment
    start: 
      mov ax,a
      mov ds,ax
      mov ax,b
      mov ss,ax
      mov sp,0fh
      mov bx,0
      mov cx,8
    s:push [bx]
      add bx,2
      loop s
      mov ax,4c00h
      int 21h
      
    code ends
    end start

     step1:用t命令执行到mov bx,0之前,此时栈顶的位置已经完成初始化;

    此时SS=076C,SP=F

    step2:查看push操作前,b段中的位置;

    step3:运行到程序返回前,此时的SS中保留的就是b段的段地址,查看b段中的数据;

    Conclusion:验证得知,数据在b段得到了逆置。


     五、总结体会 

    Question:在根据CX中存放的代码长度来进行反汇编的时候会出现反汇编出来的前面一段是我们所写入的汇编指令,但是后面会出现一些其他的指令或数据,

    CX中保存的是整个程序段的长度,如何计算数据段的长度从而用CX和数据段长度之差得到代码段的长度?

    总结:通过将不同的的数据和代码写在不同的段中,使程序段的分工更加清晰,更具有可读性。在自己设计完成对数据的操作的时候,使自己对汇编中指令更加理解。

  • 相关阅读:
    SetTransform
    D3DXCreateText
    《高级游戏特性实现》考试样题
    KeyUp
    .FX File
    CMD
    X File Class
    《DirectX游戏设计》考试样题
    ps图片处理效果——很nice哦
    学习篇:来点水货要天天学习!!!
  • 原文地址:https://www.cnblogs.com/Sun-Yiwen-blog/p/10009415.html
Copyright © 2011-2022 走看看