标签:汇编 code mov 源程序 si ax data ds 调试
1. 实验任务1
使用任意文本编辑器,录入汇编源程序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,循环实现的功能是什么,逐行理解每条指 令的功能。
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] //跳到后面的数据段 mov es:[di+1], al //将数据保存 inc si //si=si+1 add di, 2 //di=di+2 loop s //循环
使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。
使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
由此可以猜测,数值的作用为控制前字符的颜色。
2. 实验任务2
编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。
assume cs:code, ds:data data segment db 23,50,66,71,35 data ends code segment start: mov ax,0810h mov es,ax mov ax,data mov ds,ax mov ax,0 mov si,0 mov di,0 mov cx,5 s: mov al,ds:[di] mov bl,10 div bl add al,48 add ah,48 mov es:[si],al mov es:[si+1],ah mov ah,2 mov dl,es:[si] int 21h mov ah,2 mov dl,es:[si+1] int 21h mov ah,2 mov dl,32 int 21h add si,2 inc di mov ax,0 loop s mov ah,4ch int 21h code ends end start
结果:
3. 实验任务3
教材「实验5 编写、调试具有多个段的程序」(1)
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
data段数据为 23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09
cs=076c,ss=076B,ds=076A;
设程序加载后,code段的段地址为X,则data段的段地址为:X-2,stack段的段地址为:X-1
4. 实验任务4
教材「实验5 编写、调试具有多个段的程序」(2)
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
data数据:23 01 56 04;
程序返回前,cs=076c、ss=076b、ds=076a;
code段的段地址为X,则data段的段地址为:X-2,stack段的段地址为:X-1;
对于如下定义的段,name segment ... name ends
则程序加载后,该段实际占有的空间为(1+N/16)个字节;
5. 实验任务5
教材「实验5 编写、调试具有多个段的程序」(3)
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
data数据:23 01 56 04
程序返回前,cs=076A、ss=076E、ds=076D;
假设code段的段地址X,则data段的段地址为:X+3,stack段的段地址为:X+4
6. 实验任务6
教材「实验5 编写、调试具有多个段的程序」(4)
(3)可以执行,因为它的代码段定义在数据段和栈段之前,按顺序执行时,可以正确执行代码段。
7. 实验任务7
教材「实验5 编写、调试具有多个段的程序」(5)
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,c1
mov es,ax
mov si,0
mov cx,8
mov ax,0
s1: mov ax,ds:[si]
add ax,ds:[si+10h]
mov es:[si],ax
inc si
mov ax,0
loop s1
mov ax,4ch
int 21h
code ends
end start
可见相加正确。
8. 实验任务8
教材「实验5 编写、调试具有多个段的程序」(6)
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 si,0 mov cx,8
s: push ds:[si] add si,2 loop s mov ax,4ch int 21h code ends end start
标签:汇编,code,mov,源程序,si,ax,data,ds,调试 来源: https://www.cnblogs.com/dzc2000919/p/14017811.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。