使用任意文本编辑器,录入汇编源程序task1.asm。
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
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指令的功能。
源代码的功能是:将数据段前五个字节单元中的“Nuist”转换为大写和数据段后五个字节单元中的数据一起保存至附加段中在屏幕上显示。
mov cx, 5 ;设置循环次数为5 mov si, 0 ;将0送到si mov di, 0f00h ;设置起始内存单元地址 s: mov al, [si] ;将数据段前五个字节的内存单元[si]送入al and al, 0dfh ;转换字母为大写 mov es:[di], al ;将结果保存至附加段 mov al, [5+si] ;指针指向后五个字节的内存单元[5+si] mov es:[di+1], al ;将数据段后五个字节中相应的数据保存至大写字母后面 inc si ;si加1 add di, 2 ;di加2 loop s ;循环
①使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。
②使用debug工具对程序进行调试,执行到程序返回前,及line27之前,观察结果。
③修改line4里5个字节单元的值 ,重新汇编、链接、运行,观察结果。
修改后的源代码:
assume cs:code, ds:data data segment db ‘Nuist‘ db 2,3,4,5,6 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
运行结果:
④基于观察,分析、猜测这里的数值作用是什么。
答:猜测这里的数值的作用是改变显示字符的颜色。
已知数据段data中定义字节数据如下:
data segments db 23,50,66,71,35 data ends
编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。
①源代码task2.asm
assume cs:code,ds:data data segment db 23,50,66,71,35 data ends code segment start: mov ax,data mov ds,ax mov di,0 mov cx,5 s1: mov ah,0 mov al,ds:[di] mov bl,10 div bl mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h mov ah,2 mov dl," " int 21h inc di loop s1 mov ax,4c00h int 21h code ends end start
②运行结果截图
教材「实验5 编写、调试具有多个段的程序」(1)
源程序码见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查看data中的数据:
反汇编后运行至程序返回前查看data中的数据:
程序返回前各个寄存器的数据:
回答问题:
①CPU执行程序,程序返回前,data段中的数据为多少?
答:0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CABH,0987H
②CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH。
③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
教材「实验5 编写、调试具有多个段的程序」(2)
源程序码见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查看data中的数据:
反汇编后运行至程序返回前查看data中的数据:
程序返回前各个寄存器的数据:
回答问题:
①CPU执行程序,程序返回前,data段中的数据为多少?
答:0123H,0456H
②CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH。
③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
教材「实验5 编写、调试具有多个段的程序」(3)
源程序码见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,反汇编后运行至push ds:[0]前查看data中的数据:
运行至程序返回前查看data中的数据:
程序返回前各个寄存器的数据:
回答问题:
①CPU执行程序,程序返回前,data段中的数据为多少?
答:0123H,0456H
②CPU执行程序,程序返回前,cs=076AH,ss=076EH,ds=076DH。
③设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。
教材「实验5 编写、调试具有多个段的程序」(4)
如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以运行?请说明原因。
答:第(3)题的程序task5.exe仍然可以正确执行,因为如果不指明入口位置,则程序从所分配的空间开始执行,前2题开头是数据段,会被当成指令读入,只有从第(3)题一开始是指令代码。
教材「实验5 编写、调试具有多个段的程序」(5)
源程序码见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 c segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称 db 8 dup(0) c ends code segment start: mov ax,a mov ds,ax mov ax,b mov es,ax mov ax,c mov ss,ax mov bx,0 mov cx,8 s: mov ax,[bx] mov ss:[bx],ax mov ax,es:[bx] add ss:[bx],ax inc bx loop s mov ax,4c00h int 21h code ends end start
汇编、链接进入debug:
反汇编:
运行至程序返回前,查看逻辑段c的数据:
所编写程序正确实现了题目要求。
教材「实验5 编写、调试具有多个段的程序」(6)
源程序码见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,a mov ds,ax mov ax,b mov bx,0 mov ss,ax mov sp,16 mov cx,8 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
汇编、链接进入debug:
反汇编后运行至程序返回前:
查看逻辑段b的数据:
所编写程序正确实现了题目要求。
原文:https://www.cnblogs.com/chixuan220/p/14017791.html