实验3 多个段的汇编源程序编写与调试
一、实验结论
实验过程中使用到的盘符注明为v。
实验一:
实验任务(1):首先按照要求,使用txt记事本文本编辑器,录入汇编源程序task1.asm。实验代码在压缩包中给出了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | assume cs:code, ds:data data segment db 'Nuist' db 5 dup(2) data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start |
进入虚拟dos机器,目录设置为masm文件夹,对于task1.asm进行汇编连接。
执行编译好的程序,看到了结果是nuist绿的大写字母显示。
开始debug
在实验中,指定的数据段是data,为唯一的数据段,占用了字节,CX的大小是003B,因此可知具体的反汇编应该到002B处。
程序执行到末尾的时候处于内存空间的002B处,因此,调试到002B处。执行到line27处。
改变了内容进行修改重新编译连接运行,结果是出现了彩色的各种颜色的nuist
db 5 dup(2) --> 改成: db 2,3,4,5,6
后面的四个字母的颜色改变了,因此,此处数值控制的是显示的字母对应的颜色,推理可知,2对应绿色,顺应其他四种颜色对应。对应的应该是ASCII表中的标准色号。
实验任务(2):已知数据段data中定义字节数据如下: 编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。23,50,66,71,35
编写程序如下:
assume cs:code,ds:data
data segment
db 23, 50, 66, 71, 35
data ends
code segment
start:
mov cx,5
mov bx,data
mov ds,bx
s: mov al,ds:[di]
mov bl,10
mov ah,0
div bl
mov dx,ax
add dx,3030H
mov ah,2
int 21h
mov ah,2
mov dl,dh
int 21h
inc di
loop s
mov ah,4CH
int 21h
code ends
end start
执行结果包含了几个数的内容,以十进制形式打印了出来。
实验任务(3):使用任意文本编辑器,录入汇编源程序task3.asm。
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
编译连接
开始进行debug调试
执行到程序结束之前,即1D处
使用-d命令查看内存中的内容
问题1:执行前,data内数据正常的内容是 0123H,0456H,0ABCH,0DEFH,0FEDH,0CBAH,0987H
问题2:CPU执行任务返回前,CS、SS、DS内容分别是076CH,076BH,076AH
问题3:程序开始执行之前,设CODE地址为X,那么DATA段地址为X-2,STACK栈段地址为X-1.data定义了一个十六字节的地址内容,STACK栈定义了十六字节的空间,因此相差10H字节
实验任务(4):使用任意文本编辑器,录入汇编源程序task4.asm。
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h data ends stack segment dw 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
编译连接
开始debug
反汇编,执行到结束之前
问题1:任务执行完成前,data中数据未变,内容是0123H,0456H
问题2:CPU执行返回前,CS、SS、DS的内容分别是076CH、076BH、076AH
问题3:程序加载后CODE段地址为X,则DATA段地址为X-1,STACK栈段地址为X-2
问题4:如果数据段占用了十六字节,那么实际占有的空间16*[N/16+1],取整后运算
实验任务(5):使用任意文本编辑器,录入汇编源程序task5.asm。
assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
编译连接
开始debug
反汇编执行到程序结束之前
问题1:程序执行返回之前,data中的值仍然是之前的内容,即0123H,0456H
问题2:CPU执行程序返回前,CS、SS、DS的值分别是076AH、076EH、076DH
问题3:程序加载后CODE的段地址是X,则DATA的段地址是X+3,STACK栈的段地址是X+4
实验任务(6):第三个程序可以正确运行,因为不指定入口的情况下,仍然会找到加载进入内存的第一个单元,cs的初始值为ds+10,第三个程序的代码段放在最开始的时候,因此尽管有错误,还是能正常执行到程序自己退出
实验任务(7):使用任意文本编辑器,录入汇编源程序task7.asm。
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c1 segment
db 8 dup(0)
c1 ends
code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov es,ax
mov ax,c1
mov ss,ax
mov sp,8
mov cx,4
mov bx,6
s: mov al,ds:[bx]
add al, es:[bx]
mov ah,ds:[bx+1]
add ah,es:[bx+1]
push ax
sub bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
编译连接
实验任务(8):使用任意文本编辑器,录入汇编源程序task8.asm。
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 8 dup(0)
b ends
code segment
start:
mov ax,b
mov ss,ax
mov sp,16
mov ax,a
mov ds,ax
mov bx,0
s: push ds:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
编译连接
反汇编
执行到对应位置
二、实验总结
1、初步了解了字体颜色在屏幕上显示的汇编写法
2、尝试编写了十进制输出数字的程序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)