ICode9

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

实验2 多个逻辑段的汇编源程序编写与调试

2021-11-11 21:05:13  阅读:140  来源: 互联网

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


实验任务1

任务1-1

 

 

 

在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A_, 寄存器(SS) = _076B_, 寄存器(CS) = _076C_

 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2_, stack的段地址是 _X-1_。

任务1-2

task1_2.asm源码 task1_2调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

 

 

 

 

在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A_, 寄存器(SS) = _076B_, 寄存器(CS) = _076C_

假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2_, stack的段地址是 _X-1_。

任务1-3

任务task1_3.asm源码 task1_3调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

 

 

 

在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A_, 寄存器(SS) = _076C_, 寄存器(CS) = _076E_

 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-4_, stack的段地址是 _X-2_。

任务1-4

任务task1_4.asm源码 task1_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

 

 

 

在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = _076C_, 寄存器(SS) = _076E_, 寄存器(CS) = _076A_

假设程序加载后,code段的段地址是X,则,data段的段地址是_X+2_, stack的段地址是_X+4_。

任务1-5

基于上述四个实验任务的实践、观察,总结并回答:

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 _int((N+1)/16)+1_。

② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。

答:只有task1_4可以运行,end后的start表明源程序开始的地方为start,若无start,则程序从头开始运行,而其他三个程序的开头部分都为数据段,无法运行,只有task1_4的开头为代码段,能够运行。

实验任务2

源代码:

复制代码
 1 assume cs:code
 2 code segment
 3 start:
 4     mov ax,0b800H
 5     mov ds,ax
 6     mov bx,0f00H
 7     mov cx,80
 8 
 9 s:    
10     mov [bx],0403H
11     add  bx,2
12     loop s
13 
14     mov ah,4ch
15     int 21h
16 code ends
17 end start
复制代码

实验结果:

 

 

 

实验任务3

源代码:

复制代码
 1 assume cs:code
 2 data1 segment
 3     db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
 4 data1 ends
 5 
 6 data2 segment
 7     db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0       ; ten numbers
 8 data2 ends
 9 
10 data3 segment
11     db 16 dup(0)
12 data3 ends
13 
14 code segment
15 start:
16     mov ax,data1
17     mov ds,ax
18     mov bx,0
19     mov cx,10
20 s:
21     mov al,ds:[bx]
22     add al,ds:[bx+16]
23     mov [bx+32],al
24     inc bx
25     loop s
26 
27     mov ah,4ch
28     int 21h
29 code ends
30 end start
复制代码

在数据项依次相加之前,查看逻辑段data1, data2, data3对应的内存空间数据原始值的 debug命令和截图:

 

依次相加之后,查看逻辑段data1, data2, data3对应的内存空间数据原始值的debug命令和截图:

 

实验任务4

源代码:

复制代码
 1 assume cs:code
 2 
 3 data1 segment
 4     dw 2, 0, 4, 9, 2, 0, 1, 9
 5 data1 ends 
 6 
 7 data2 segment
 8     dw 8 dup(?)
 9 data2 ends
10 
11 code segment
12 start:
13     mov ax,data1
14     mov ds,ax
15     mov bx,0
16     mov ax,data2
17     mov ss,ax
18     mov sp,10h
19     mov cx,8
20 s:
21     push [bx]
22     add bx,2
23     loop s
24     
25     mov ah, 4ch
26     int 21h
27 code ends
28 end start
复制代码

原数据段截图:

在程序退出前,使用d命令查看数据段data2对应的内存空间的截图:

 

 

实验任务5

源代码:

复制代码
 1 assume cs:code, ds:data
 2 data segment
 3         db 'Nuist'
 4         db 5 dup(2)
 5 data ends
 6 
 7 code segment
 8 start:
 9         mov ax, data
10         mov ds, ax
11 
12         mov ax, 0b800H
13         mov es, ax
14 
15         mov cx, 5
16         mov si, 0
17         mov di, 0f00h
18 s:      mov al, [si]
19         and al, 0dfh
20         mov es:[di], al
21         mov al, [5+si]
22         mov es:[di+1], al
23         inc si
24         add di, 2
25         loop s
26 
27         mov ah, 4ch
28         int 21h
29 code ends
30 end start
复制代码

运行结果截图:

 

使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即ine25执行之后、line27 执行之前)的截图:

 

 

源代码中line19的作用是?

通过and方法,将所有的字母都转换为大写字母。

 

源代码中data段line4的字节数据的用途是?

使字母呈现不同的颜色。

 

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。

 

实验任务6

源代码:

复制代码
 1 assume cs:code, ds:data
 2 
 3 data segment
 4     db 'Pink Floyd      '
 5     db 'JOAN Baez       '
 6     db 'NEIL Young      '
 7     db 'Joan Lennon     '
 8 data ends
 9 
10 code segment
11 start:
12     mov ax,data
13     mov ds,ax
14     mov bx,0
15     mov cx,4
16 s:
17     mov al,[bx]
18     or al,00100000b
19     mov [bx],al
20     add bx,16
21     loop s
22        
23    mov ah, 4ch
24    int 21h
25 code ends
26 end start
复制代码

原数据截图:

在程序退出前,使用d命令查看数据段data对应的内存空间的截图:

实验任务7

源代码:

复制代码
 1 assume cs:code, ds:data, es:table
 2 
 3 data segment
 4     db '1975', '1976', '1977', '1978', '1979' 
 5     dw  16, 22, 382, 1356, 2390
 6     dw  3, 7, 9, 13, 28 
 7 data ends
 8 
 9 table segment
10     db 5 dup( 16 dup(' ') )  ;
11 table ends
12 
13 code segment
14 start:
15     mov ax,data
16     mov ds,ax
17     mov ax,table
18     mov es,ax
19     mov bx,0
20     mov si,0
21     mov cx,5
22 s1:
23     mov ax,[bx]
24     mov es:[si],ax    
25     mov ax,[bx+2]
26     mov es:[si+2],ax
27     add bx,4
28     add si,16
29     loop s1
30     
31     mov bx,20
32     mov cx,5
33     mov si,5
34 s2:
35     mov ax,0
36     mov es:[si+2],ax 
37     mov ax,[bx]
38     mov es:[si],ax
39     add bx,2
40     add si,16
41     loop s2
42 
43     mov bx,30
44     mov cx,5
45     mov si,10
46 s3:
47     mov ax,[bx]
48     mov es:[si],ax
49     add bx,2
50     add si,16
51     loop s3
52 
53     mov cx,5
54     mov si,0
55 s4:     
56     mov ax, es:[si+5] 
57     mov dx, es:[si+7] 
58     div word ptr es:[si+10]
59     mov es:[si+13],ax
60     add si,16
61     loop s4
62 
63     mov ah, 4ch
64     int 21h
65 code ends
66 end start
复制代码

查看table段原始数据信息截图:

 

在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是否按要求结构化地写入到指定内存:

 

 

 

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

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

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

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

ICode9版权所有