实验任务1
任务1-1
task1_1.asm源码 task1_1调试到line17结束、line19之前截图
问题回答
① 在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的字节数据的用途是?
答:使5个字母呈现不同的颜色。
修改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段对应的内存空间的截图,确认信息是否按要求结构化地写入到指定内存:
如图所示,已成功写入。
实验总结
通过本次实验,我对汇编书上5-8章的内容有了更加深刻的理解,熟悉了如何通过自己书写的代码达到想要的结果,熟悉了汇编的编程过程,实验一通过阅读程序使我理解了内存的存储方式,也为我后面写代码提供了很多灵感,实验2-6实质上大同小异,都是活用自己所学的知识,通过编程完成相应的课题,实验7有点难度,但通过细心分析理解,将问题化整为零,一步步求解,最终还是得到了理想的结果。本次实验使我将书本上的知识得以在实践中运用,令我受益良多。