实验2 多个逻辑段的汇编源程序编写与调试
2021/11/11 22:14:16
本文主要是介绍实验2 多个逻辑段的汇编源程序编写与调试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
实验任务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段对应的内存空间的截图,确认信息是否按要求结构化地写入到指定内存:
这篇关于实验2 多个逻辑段的汇编源程序编写与调试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南