ICode9

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

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

2021-11-12 09:35:18  阅读:152  来源: 互联网

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


实验任务1

任务1-1

<task1_1.asm>

调试到line19之前的截图:

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

② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2_, stack的段地址是 _X-1_。(十六进制)

 

任务1_2

<task1_2.asm>

 调试到line19之前:

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

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

 

任务1_3

<task1_3.asm>

 调试到line19之前:

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

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

 

任务1_4

<task1_4.asm>

单步调试:

程序装入内存后,code段地址应为ds+10H,即076AH

执行mov ax,data后,ax为076CH,即程序装入后,data段段地址为076CH

执行mov ax,stack后,ax为076EH,即程序装入后,stack段段地址为076EH

回答问题:

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

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

 

任务1_5

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

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

task1_1, task1_2,task1_3无法执行(以task1_3为例):

task1_4可以执行,当不写程序执行的入口时,默认从头执行,因为开头为程序段,所以可以执行

实验任务2

编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数 据03 04。

运行结果:

实验任务3

编程实现把逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中。

<task3.asm>补充代码:

依次查看相加前、后三个逻辑段对应内存空间,确认结果相加后保存在逻辑段data3中,调试结果:

实验任务4

补全程序,实现把逻辑段data1中的8个字数据逆序存储到逻辑段b中。

<task4.asm>补充代码:

使用d命令查看data2对应内存空间:

实验任务5

<task5.asm>

 1 assume cs:code, ds:data
 2 data segment
 3         db 'Nuist'
 4         db 2, 3, 4, 5, 6
 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            ;循环5次
16         mov si, 0             ;初始si偏移量为0
17         mov di, 0f00h     ;初始di偏移量为0f00h,为输出指定位置
18 s:      mov al, [si]          ;
19         and al, 0dfh         ;每一次把数据段的第一段(Nuist)的一个字母和11011111按位与运算,第三位置0,相当于减32(十进制)
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

循环实现功能:每次循环把Nuist的一个字母变为对应的大写字母,然后以第二个数据段对应位置的数字设置输出颜色,并显示到屏幕指定位置

line19作用:和11011111按位与运算,将字母转为对应大写字母

修改line4为 db 5 dup(2):

此处数字控制输出内容的前景,背景色。

实验任务6

将data段的每行第一个单词从大写->小写

<task6.asm>

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     db 'Pink Floyd      '       ;16字节
 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    
15    mov al, 20h   ;00100000
16    mov bx, 0   
17    mov cx, 4       ;4行
18  s:
19    or [bx+0], al   
20    or [bx+1], al
21    or [bx+2], al
22    or [bx+3], al
23    add bx,16
24    loop s
25 
26    mov ah, 4ch
27    int 21h
28 code ends
29 end start

测试结果:

此题也可以使用嵌套循环,但注意循环次数cx需要用栈来存放。

实验任务7

将数据存入表中

<task7.asm>

 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 
18     mov ax,table
19     mov es,ax
20 
21     mov bx, 0
22     mov bp, 0          ;年份从第0位开始
23     mov cx, 5
24     s0:
25     mov ax, [bx] 
26     mov es:[bp], ax
27     mov ax,ds:[bx+2]
28     mov es:[bp+2], ax
29     add bx,4
30     add bp,16
31     loop s0
32 
33     mov bx, 20
34     mov bp, 5             ;收入从第5位开始
35     mov cx, 5
36     s1:
37     ;mov word ptr es:[bp+2], 0  ;空位置0
38     mov ax, [bx]
39     mov es:[bp], ax
40     add bx,2
41     add bp,16
42     loop s1
43 
44     mov bx, 30
45     mov bp, 10              ;人数从第10位开始
46     mov cx, 5
47     s2:
48     mov ax, [bx]
49     mov es:[bp], ax
50     add bx,2
51     add bp,16
52     loop s2
53 
54     mov bx,20
55     mov bp,13                ;人均收入从第13位开始
56     mov cx, 5
57     s3:
58     mov ax, [bx]
59     mov dl, ds:[bx+10]
60     div dl
61     mov es:[bp], al
62     ;mov byte ptr es:[bp+1], 0 空位置0
63     add bx,2
64     add bp,16
65     loop s3
66 
67     mov ah, 4ch
68     int 21h
69 code ends
70 end start

测试结果:

标签:汇编,code,data,mov,bp,ax,bx,源程序,调试
来源: https://www.cnblogs.com/yao-bai/p/15526934.html

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

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

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

ICode9版权所有