Skip to content

Latest commit

 

History

History
105 lines (72 loc) · 2.97 KB

File metadata and controls

105 lines (72 loc) · 2.97 KB

第六章:包括多个段的程序

要点

  • end start 标号可以通知编译器程序的入口地址为 start 标号,例子见 累加数字2,start 本身不是固定的,可以使用任何合法的标号

检测点 6.1

  1. 下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据,完成程序:
assume cs:codesg

code segment
    dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h

start:
    mov ax, 0
    mov ds, ax
    mov bx, 0

    mov cx, 8
s:
    mov ax, [bx]
    mov cs:[bx], ax
    add bx, 2
    loop s

    mov ax, 4c00h
    int 21h
codesg ends
end start
  1. 下面的程序实现一次用内存 0:0~0:15 单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内,完成程序:
assume cs:codesg

codesg segment
    dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
    dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

start:
    mov ax, cs
    mov ss, ax
    mov sp, 0024h

    mov ax, 0
    mov ds, ax
    mov bx, 0
    mov cx, 8
s:
    push [bx]
    pop cs:[bx]
    add bx 2
    loop s

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

程序

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

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

实验代码1

* CPU 执行程序,程序返回前,data 段中的数据为多少? 「不变」
* 设程序加载后,code 段的段地址为 X,则 data 段的段地址为「X-2」,stack 段的段地址为「X-1」
  1. 将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题

实验代码2

* CPU 执行程序,程序返回前,data 段中的数据为多少? 「不变」
* 设程序加载后,code 段的段地址为 X,则 data 段的段地址为「X-2」,stack 段的段地址为「X-1」
  1. 将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题

实验代码3

* CPU 执行程序,程序返回前,data 段中的数据为多少? 「不变」
* 设程序加载后,code 段的段地址为 X,则 data 段的段地址为「X+3」,stack 段的段地址为「X+4」
  1. 如果将 1、2、3 题中的最后一条伪指令 end start 改为 end,哪个程序仍然可以正确执行?请说明原因。

程序 3 可以正确执行,因为 end start 改为 end 后,程序按顺序执行,程序 3 的代码段放在最前面,因此可以正确执行。

  1. 程序如下,编写 code 段中的代码,将 a 段和 b 段中的数据依次相加,将结果存在 c 段中。

实验代码5

  1. 程序如下,编写 code 段中的代码,用 push 指令将 a 段中的前 8 个字型数据,逆序存储到 b 段中

实验代码6