• 实验五 编写、调试具有多个段的程序


    四.实验结论

    1

    (1)cpu执行程序,程序返回前,data段中的数据为:23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09

    如下图所示:

    (2)cpu执行程序,程序返回前,cs=076c,ss=076b,ds=076a

    如下图所示

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

    因为data一共占16个字节,stack一共占16个字节。

    2

    (1)cpu执行程序,程序返回前,data段中的数据为:23 01 56 04

    如下图所示:

    (2)cpu执行程序,程序返回前,cs=076c,ss=076b,ds=076a

    如下图所示:

     

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

    (4)对于如下定义的段:

    name segment
    ...
    
    name ends
    

     如果段中的数据占n个字节,则程序加载后,该段实际占有的空间为:((n+15)/16)*16。

    ⚠️因为每个段都是以16字节来对齐的,但是最大不能超过64KB 。这也就是说,如果你的段数据在16字节内,一样会被当做一个字节段来算,就是16字节。 要是大于16字节,多出来的1个字节也得有一个字节段的容量来存储它,所以这时得占两个字节段,就是32字节。 分为两种情况,如果n为16的倍数,则占空间为(n/16)*16。如果n不为16的倍数,则占空间为(n/16+1)*16。综上可以写成((n+15)/16)*16。

    3.

    (1)cpu执行程序,程序返回前,data段中的数据为:23 01 56 04

     

    (2)cpu执行程序,程序返回前,cs=076a,ss=076e,ds=076d

     

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

    通过反汇编可看出。

    4.

    如果将(1)(2)(3)题中的最后一条伪指令“end start”改为“end”,则哪个程序仍可以正确执行?请说明原因。

    只有第三个可以正常运行。因为前两个找不到程序入口无法执行第一条语句。(1)(2)开始是数据段,只有(3)是指令代码。

    5.

    源代码如下:

    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 0,0,0,0,0,0,0,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 dx,[bx]
      mov ax,b
      mov ds,ax
      add dx,[bx]
      mov ax,c
      mov ds,ax
      mov [bx],dx
      inc bx
      loop s
      mov ax,4c00h
      int 21h
    
    code ends
    
    end start
    

    单步调试到mov [bx],dx之前,用d命令查看c中数据:

    再用g命令调到程序返回前,用d命令查看c中数据 

    经验证,数据实现了相加。

    6.

     源代码如下:

    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 0,0,0,0,0,0,0,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 dx,[bx]
      mov ax,b
      mov ds,ax
      add dx,[bx]
      mov ax,c
      mov ds,ax
      mov [bx],dx
      inc bx
      loop s
      mov ax,4c00h
      int 21h
    
    code ends
    
    end start
    

     用t命令调试到push操作之前,用d命令查看b中内容 

    用g命令调试到程序返回前,再用d命令查看b中内容 

     经验证,数据实现了逆置。

    五.总结与体会

     通过学习编写多个段的程序,使我们编写的程序更加地清晰,更有条理。知道了段中的数据占n个字节,则程序加载后,该段实际占有的空间为((n+15)/16)*16。

    在自己操作实践的过程中有些步骤不太熟练,以后仍要多操作,多练习。

  • 相关阅读:
    IntelliJ IDEA 使用总结[zz]
    “vmware tools 只能虚拟机中安装”的解决方法
    Git 少用 Pull 多用 Fetch 和 Merge
    hypervisor与VMware共存方法
    rsa && sha1 js code
    PHP导出数据库方法
    Git中的AutoCRLF与SafeCRLF换行符问题
    DOTA2参数收集
    HelloGitHub.com 网站开源了
    第 10 篇 评论接口
  • 原文地址:https://www.cnblogs.com/makaya/p/10013677.html
Copyright © 2020-2023  润新知