实验任务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
测试结果: