ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

实验3 多个段的汇编源程序编写与调试

2020-11-24 17:34:26  阅读:174  来源: 互联网

标签:汇编 code 程序 mov si ax data 源程序 调试


一、实验目的   1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试   2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式   3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法     4. 理解并掌握各种寻址方式的灵活应用   5. 掌握汇编指令loop, and, or,div, mul的用法   二、实验准备   复习教材chapter 6-8章。   chapter 6 包含多个段的程序   chapter 7 更灵活的定位内存地址的方法   chapter 8 数据处理的两个基本问题   三、实验内容 1. 实验任务1 使用任意文本编辑器,录入汇编源程序task1.asm。
assume cs:code, ds:data
data segment
        db 'Nuist'
        db 5 dup(2)
data ends

code segment
start:
        mov ax, data
        mov ds, ax

        mov ax, 0b800H
        mov es, ax

        mov cx, 5
        mov si, 0
        mov di, 0f00h
s:      mov al, [si]
        and al, 0dfh
        mov es:[di], al
        mov al, [5+si]
        mov es:[di+1], al
        inc si
        add di, 2
        loop s

        mov ah, 4ch
        int 21h
code ends
end start
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指令的功能。 答:line15-25实现的功能是将小写字母大写,并给它加上颜色输出到显存。line15行记录了要循环的次数。line16记录了ds的起始偏移地址,line17记录了显存的起始偏移地址。line18进入到了循环,将数据栈data segment中的第一个字符“N”传入到al寄存器中,并在line19行对它进行与运算,将它转换成大写字母,在line20行将大写字母写入到显存中。line21-22将颜色信息写入到显存中。     • 使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。     • 使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。

  • 修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
1 db  5  dpu(2)
2 -->  改成:
3 db  2,3,4,5,6
基于观察,分析、猜测这里的数值作用是什么。 答: db 5 dup(2) 表示分配五字节内存空间并初始化为2。 db 2,3,4,5,6 表示直接分配五字节的内存空间并初始化为2,3,4,5,6。猜测这里的数值的作用是改变显示字符的颜色。   2. 实验任务2 已知数据段data中定义字节数据如下: 
1 data segments 
2     db 23, 50, 66, 71, 35 
3 data ends
编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。  ♦ 提示:   1个两位数如何输出              

 

  具体处理步骤如下:   第1步,利用除法指令div,计算出每个数位上的数值。   第2步,利用数值和数字字符之间ascⅡ码的关系,把数值→数字字符   第3步,利用系统功能调用int 21h中的2号子功能,输出单个字符。  int 21h中的2号子功能说明如下: 功能:输出单个字符 用法: 
1 mov ah,2
2 mov dl, ×× ; ××是待输出的字符,或其ASCⅡ码值
3 int 21h
♦ 5个两位数如何输出   利用loop指令,以及,灵活的寻址方式。
 1 assume cs:code,ds:data
 2 data segment
 3     db 23,50,66,71,35
 4 data ends
 5 
 6 code segment
 7 start:
 8     mov ax,data
 9     mov ds,ax
10 
11     mov cx,5
12     mov si,0
13 
14 s1:    mov ah,0
15     mov bl,10
16     mov al,ds:[si]
17     div bl
18     mov bx, ax
19 
20     mov ah,2
21     mov dl,30h
22     add dl,bl
23     int 21h
24 
25     mov dl,30h
26     add dl,bh
27     int 21h
28     mov dl," "
29     int 21h
30 
31     inc si
32     loop s1
33 
34     mov ah,4ch
35     int 21h    
36 code ends
37 end start

 

 

3. 实验任务3 教材「实验5 编写、调试具有多个段的程序」(1) 程序源码见task3.asm  

 

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

 data段中的数据为:0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h

2、CPU执行程序,程序返回前,cs=076C、ss=076B、ds=076A

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

4. 实验任务4 教材「实验5 编写、调试具有多个段的程序」(2) 程序源码见task4.asm。  

1、data段中的数据为:0123h, 0456h

2、CPU执行程序,程序返回前,cs=076C、ss=076B、ds=076A

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

4、对于如下定义的段:

name segment
...
name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为:[(N/16)向上取整]*16。因为计算机占据的空间必须为16的倍数。

5. 实验任务5 教材「实验5 编写、调试具有多个段的程序」(3) 程序源码见task5.asm。  

1、data段中的数据为:0123h, 0456h

2、CPU执行程序,程序返回前,cs=076A、ss=076E、ds=076D

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

6. 实验任务6 教材「实验5 编写、调试具有多个段的程序」(4)   如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。 答:第(3)题的程序仍然可以正确执行,因为如果不指明程序入口的位置,那么程序则从所分配的空间开始执行,因为(1)和(2)开头是数据段,会被当成指令读入引起错误,而(3)的数据段和栈段定义于代码段之后,在顺序执行时就会先执行代码段。使程序可以正确的执行。   7. 实验任务7 教材「实验5 编写、调试具有多个段的程序」(5) 程序源码见task7.asm。   
 1 assume cs:code
 2 a segment
 3   db 1,2,3,4,5,6,7,8
 4 a ends
 5 
 6 b segment
 7   db 1,2,3,4,5,6,7,8
 8 b ends
 9 
10 c segment   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
11   db 8 dup(0)
12 c ends
13 
14 code segment
15 start:
16     mov ax,a
17     mov ds,ax
18     mov cx,8
19     mov si,0
20 
21 s:    mov ax,[si]
22     add ax,[si+10h]
23     mov [si+20h],ax
24     inc si
25     loop s
26 
27     mov ax,4c00h
28     int 21h
29 code ends
30 end start

 

 

8. 实验任务8 教材「实验5 编写、调试具有多个段的程序」(6) 程序源码见task8.asm。
 1 assume cs:code
 2 a segment
 3   dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
 4 a ends
 5 
 6 b segment
 7   dw 8 dup(0)
 8 b ends
 9 
10 code segment
11 start: 
12     mov ax,a
13     mov ds,ax
14     mov ax,b
15     mov ss,ax
16 
17     mov cx,8
18     mov si,0
19     mov sp,10h
20 
21 s:    push [si]
22     add si,2
23     loop s
24 
25     mov ax,4c00h
26     int 21h    
27 code ends
28 end start

 

 

标签:汇编,code,程序,mov,si,ax,data,源程序,调试
来源: https://www.cnblogs.com/wangsituo/p/14030676.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有