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

本文详细解析了三个不同的8086汇编语言程序实例,涵盖数据段初始化、寄存器状态检查、代码段执行流程及内存单元交互。通过跟踪debug下程序运行过程,展示了不同数据和代码段的地址分配、执行前后数据变化,以及如何通过push和pop指令实现数据逆序存储等关键操作。

 

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

查看代码具体执行到哪个单元。

42h包括了data与stack与输出部分三者所占据的代码字节数,减去即为需要实现的代码数

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

0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

(2)CPU执行程序,程序返回前,cs=0772h,ss=0771h,ds=0770h

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

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

assume cs:code,ds:data,ss:stack

data segment

      dw 0123h,0456h

data ends

stack segment

      dw 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

 

 反汇编得到需要的字节数,查看寄存器的状态。

1.CPU执行程序,程序返回前,data中的数据为16个字节空间,前两个字数据不变,其余为0。

2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH(与上题一致).

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

4.对于如下定义的段:

name segment

...

name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16)

若N<16,则补全为16。

N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16),若N<16,则补全为16。

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

assume cs:code,ds:data,ss:stack

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

data segment

      dw 0123h,0456h

data ends

stack segment

      dw 0,0

stack ends

end start

1.CPU执行程序,程序返回前,data段中的数据如上图所示。

2.CPU执行程序,程序返回前,cs=076AH,ss=076EH,ds=076DH.

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

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

第一个程序

第三个程序可以正确执行,因为前两个默认代码的入口为data的入口,而第三个开头即为需要的实现代码,通过更改前两个代码data,stack,code的位置即可以成功执行。

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 0,0,0,0,0,0,0,0

c ends

code segment

start:

  mov  bx,0

  mov  cx,8

s:  mov dx,0(清零操作)

  mov ax,a(阶段一)

  mov ds,a

  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

结果正确

(6)程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到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 0,0,0,0,0,0,0,0

b ends

code  segment

start:

  mov ax,b(栈的设置)

  mov ss,ax

  mov sp,10h

  mov ax,a(当前代码段地址)

  mov ds,ax

  mov cx,8

  mov bx,0

s: push [bx](简单的入栈操作)

  add bx,2

  loop s

mov ax,4c00h

int ax,21h

code ends

end start

结果都是正确的

 

转载于:https://www.cnblogs.com/onioneer/p/10046551.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值