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

    一、实验任务

    完成教材133实验5

    1、将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。

    assume cs:code, ds:data, ss:stack
    data segment
      dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
    data ends
    
    stack segment
      dw 0, 0, 0, 0, 0, 0, 0, 0
    stack ends
    
    code segment
    start:  mov ax,stack
            mov ss, ax
            mov sp,16
            
            mov ax, data
            mov ds, ax
            
            push ds:[0]
            push ds:[2]
            pop ds:[2]
            pop ds:[0]
            
            mov ax,4c00h
            int 21h
    
    code ends
    end start

    用u指令反汇编,g指令执行到001d前,得到程序返回前。

    (1)CPU执行程序,程序返回前,data段中的数据为多少?

     

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

    (3)设程序加载后、code段段段地址为X,则data段的段地址为X-2,stack段的段地址为X-1(通过反汇编可以得到)。

     2、运行ex5_2 debug(操作同1)

    (1)CPU执行程序,程序返回前,data段中的数据为多少?

    (2)CPU执行程序,程序返回前,cs、ss、ds的值。

     

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

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

    name segment

    ...

    name ends

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

    在8086CPU架构中,每个段都是以16字节来对齐的,即若段数据在16字节以内,也计作16字节。

     3、运行ex5_3 debug

    (1)CPU执行程序,程序返回前,data段中的数据为多少?

    (2)CPU执行程序,程序返回前,cs、ss、ds的值。

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

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

     (1)(2)无法执行,因为(1)(2)以数据段开始,找不到程序入口无法执行第一条语句。(3)以指令开始,可以执行。

    5、编写code段中的代码,将a段和b段中的数据一次相加,结果存到c段中。(补充完整后代码如下)

    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 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命令单步执行到mov [bx],dx之前,使得ds中保存的是c段的段地址。用d命令查看此时的c段中的内容。

     ·运行到程序结束前,d命令查看c段内容。

    实验验证完毕。

    6、编写code段中代码,用push指令将a段中的前八个字型数据逆序存储到b段中。

    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,10h
    mov bx,0
    mov cx,8

    s:push [bx]
    add bx,2h
    loop s

    mov ax,4c00h
    int 21h
    code ends
    end start

    用u指令反汇编、用g指令运行到程序返回前、用d指令查看b中内容。得到逆序。

    总结:

    了解了寄存器分段存储的相关知识,分段存储更加简洁明了,以及复习了栈的知识。实践时不够熟练,还是要多加练习。

  • 相关阅读:
    委托与事件参数的简单运用
    C#消息队列专题
    项目计划流程简易描述
    cookies 客户端历史记录篇
    朋友做的VS2005插件:等号两边值互换
    SSE2指令集系列之二
    SSSE3指令集
    SSE3指令集系列
    SSE特殊指令集系列之一
    SSE2指令集系列之一
  • 原文地址:https://www.cnblogs.com/Xingxixi/p/10014389.html
Copyright © 2011-2022 走看看