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

四、实验结论

*任务(1)(2)(3)基本步骤相同,这里只列举出(1)的实验步骤

步骤一:把要使用的代码粘贴到masm文件夹中。

步骤二:编译、连接、用debug调试。

步骤三:用r命令查看哥寄存器的值。

    cs是code的段地址,ds是data的段地址,ss是stack的段地址。这是因为代码前面的声明:   assume cs:code, ds:data, ss:stack

步骤四:用u命令反汇编,注意反汇编是code段,所以u命令后接的应该是cs。

步骤五:用g命令执行,根据反汇编得到的代码,执行到mov ax,4c00之前。这里g命令的使用是断点的使用。

步骤六:使用d命令查看data段的值。由于data的段地址是ds,所以从ds:0到ds:f查看16个字节。

*任务(2)(3)步骤大同小异,这里就不多列举了。



实验结果:

任务一:

任务二:

任务三:

任务四:

任务一修改:

任务二修改:

任务三修改:

结论:从反汇编可以看出,把end start改成end后,只有实验三可以正常运行。

分析:start提供程序的入口,使cs:ip 指向第一条要执行的指令。任务一和任务二的代码中,汇编指令代码段并不是在开头,所以cs:ip在默认的开头;任务三的汇编指令代码在开头,cs:ip刚好指向她。



关于任务二的第4小问:举ex5_1为例;其存储数据的段地址是ds。

①ex5_1源代码:

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

经过编译连接运行后,使用r命令查看,ds=075a , ss=076b , cs=076c,这意味着给data段落分配了10h,即16字节的空间。

②ex5_1_2源代码(data段落的字节给了17个字节的数据):     (此步骤也可以使用任务三的各个寄存器的值)

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h,0123h
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

经过编译连接运行后,使用r命令查看,ds=075a , ss=076c , cs=076d,这意味着给data段落分配了20h,即32字节的空间。

结论:由此看来,储存的数据不足16字节,给他分配16字节的空间;储存的数据多于16字节的整数倍,则会给多余的、不满16字节的数据分配一整的16字节的空间。

答案:(N/16+1)*16



另外,在修改程序的过程中,如果把英文字符写成中文字符,例如:把  ”,“ 写成 ”,“,会出现如下错误:



任务五:

源代码:

assume cs:code, ds:a, es:b, ss:c
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 ax,a
      mov ds,ax      mov ax,b
      mov es,ax
      mov ax,c
      mov ss,ax      mov cx,8       mov bx,0
 s: mov al, ds:[bx]
    add al, es:[bx]
    mov ss:[bx],al
    inc bx
    loop s

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

①编译、连接

②debug执行,d命令查看c段

③u命令反汇编,g命令执行

④d命令查看c段

任务六:

assume cs:code,ds:a,ss:b
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,2
    loop s
    mov ax,4c00h
    int 21h
code ends
end start

①编译、连接

②d命令查看执行前ss段

③debug执行,r命令查看各寄存器初始值,u命令反汇编,g命令断点执行

④d命令查看执行后ss段



五、总结与体会

实验没有什么难处,主要是在任务二的第四小题,看是看不出来的,必须通过实验来测试。

实验的好处真的挺多的,还可以发现许多微小错误,比如,把英文字符写成中文字符时的提示等等。

原文地址:https://www.cnblogs.com/Master-Sun/p/10017229.html

时间: 2025-01-14 08:57:39

【实验五】编写、调试具有多个段的程序的相关文章

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

实验1 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 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]

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

南京信息工程大学实验报告 实验名称   实验 5 编写.调试具有多个段的程序 实验日期  12.2 得分 学院   计软院 专业   计科 年级   2017级 班次    6班 姓名    江轲禹 学号    20171308227 一.实验目的 1. 理解和掌握将数据.代码.栈放入不同段的程序的编写和调试 2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式 二.实验准备 1. 结合第6章教材和课件,复习第6章内容 2. 复习第3章「栈」的知识 三.实验内容 教材133实验 5

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

实验结论 实验1 1.实验代码 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 start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2

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

四.实验结论 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段中的数

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

实验任务一 将下面的程序编译.链接,用debug加载.跟踪,然后回答问题. 1 assume cs:code, ds:data, ss:stack 2 data segment 3 dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h 4 data ends 5 6 stack segment 7 dw 0, 0, 0, 0, 0, 0, 0, 0 8 stack ends 9 10 code segment 11 start: mo

实验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 m

汇编试验五:编写、调试具有多个段的程序

ds 数据段放入数据正确: 两次push 操作后,ss栈段正确: 由于pop 操作顺序,ds数据段并没有发生改变: Source Code: 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,

汇编语言实验五

实验任务一 1.利用debug加载.跟踪程序 (1)先利用r命令来查看各个寄存器的值 (2)从cx中可知道程序的长度,用cx中的值减去20h(数据段和栈段已分配的空间)得到代码段的长度,用u命令精确反汇编 (3)先执行到000D之前,看看ds是否已成功指向数据段 (4)从上图可以看到ds已指向数据段,然后我们接着执行到程序返回前,即到001D之前,再查看一次数据段的内容 (5)从上图可以看到,数据段没有发生变化 2.书上的问题解答: (1)程序返回前,data段中的数据为 23 01 56 04

包含多个段的程序

在前一章我们提到0:200~0:2FF地址空间是相对安全的,但是这段空间的容量只有256个字节. 在操作系统中只要是通过操作系统申请的空间就都是安全的,操作系统负责给程序分配安全的空间.在操作系统允许的情况下,程序可以取得任意数量的空间. 按程序获取所需空间的时间,获取空间方法可分为两种: 在加载程序的时候为程序分配 在程序执行的过程中向系统申请 本书中不论描述第二种 对于汇编程序,如果需要他在被加载的时候取得所需的空间,就必须要在源程序中做出说明,对于汇编源程序来讲就是在汇编源程序中做出相应段