汇编语言实验五

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

一、 实验目的

  1. 熟练使用debug调试具有多个段的汇编程序。
  2. 学会合理使用代码段、栈段、数据段。

二、实验内容或主要代码

  • 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

  • 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

  • 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

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

  • 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:
    ?

    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,0,0ah,0bh ,0ch,0dh,0eh,0fh,0ffh
    a ends
    b segment
    dw 0,0,0,0,0,0,0,0
    b ends
    code segmment
    start:
    ?
    code ends
    end start

三、 实验结果或截图

1.在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(1)CPU执行程序,程序返回前,data段中的数据为多少?
答:不变,仍为0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h。
(2)CPU执行程序,程序返回前,cs=04b0h、ss=04afh、ds=04aeh。
(3)设程序加载后,code段的短地址为X,则data段的段地址为X-2,stack段的短地址为X-1。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(1)CPU执行程序,程序返回前,data段中的数据为多少?
答:不变,仍为0123h,0456h。
(2)CPU执行程序,程序返回前,cs=04b0h、ss=04afh、ds=04aeh。
(3)设程序加载后,code段的短地址为X,则data段的段地址为X-2,stack段的短地址为X-1。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(1)CPU执行程序,程序返回前,data段中的数据为多少?
答:不变,仍为0123h,0456h。
(2)CPU执行程序,程序返回前,cs=04b0h、ss=04afh、ds=04aeh。
(3)设程序加载后,code段的短地址为X,则data段的段地址为X+3,stack段的短地址为X+4。

4.都能正确执行,如果不指明程序的入口,编辑器自动默认代码的第一条指令为程序的入口。
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 ax,a
mov ds,ax
mov bx,0
mov cx,8
s:mov al,ds:[bx]
add al,ds:[bx+16]
mov ds:[bx+32],al
inc bx
loop s

code ends
end start
在这里插入图片描述
在这里插入图片描述经过多次t命令追踪后:
在这里插入图片描述
6.
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0,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,a
mov ds,ax
mov bx,0
mov ax,b
mov ss,ax
mov sp,16
mov cx,8

s:push [bx]
inc bx
inc bx
loop s

code ends
end start

在这里插入图片描述
在这里插入图片描述经过多次t命令追踪后:在这里插入图片描述
四、实验分析或体会

此次实验,重点在于程序的编译、连接,Debug的加载、跟踪。通过此次实验,我深刻了解了end的作用,若end指明了程序的入口,CPU会直接从入口处开始执行;若未指明,程序从加载进内存的第一个单元起开始执行。并且,定义多个段来存放数据、代码、栈使程序井然有序,可读性强。

  • 9
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值