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
运行结果:
在debug里调试到程序返回前的截图:
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
1 db 5 dup(2) 2 --> 改成: 3 db 2,3,4,5,6
源代码中data段line4的字节数据的用途是?
控制显示字符的颜色
已知数据段data中定义字节数据如下:
1 data segments 2 db 23, 50, 66, 71, 35 3 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 si, 0 mov cx,5 s: mov ax,0 mov al, [si] mov bl,10 div bl ;利用除法指令div,计算出每个数位上的数值 mov bx,ax add bl,48 ;将十位数值转换成数字字符 add bh,48 ;将个位数值转换成数字字符 mov dl,0 mov ah,2 mov dl,bl int 21h ;利用系统调用int21h中的2号子功能,输出十位字符 mov ah,2 mov dl,bh int 21h ;输出个位字符 mov ah,2 mov dl,32 int 21h ;输出空格 inc si loop s mov ah, 4ch int 21h code ends end start
运行结果截图
源代码文件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
①cpu执行程序,程序返回前,data段中的数据为多少?
data段不变
②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。
③设程序加载后,code段的段地址为X,则data段的段地址为X-2h,stack段的段地址为X-1h。
源代码文件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
①cpu执行程序,程序返回前,data段中的数据为多少?
data段不变
②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。
③设程序加载后,code段的段地址为x,则data段的段地址为x-2h,stack段的段地址为x-1h。
④对于如下定义的段
1 name segment 2 ... 3 name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为____。
(N/16-1)*16+16个字节
源代码文件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
①cpu执行程序,程序返回前,data段中的数据为多少?
data段不变
②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。
③设程序加载后,code段的段地址为x,则data段的段地址为x-2h,stack段的段地址为x-1h。
如果将task3,task4,task5中的最后一条伪指令“end start"改为”end",则哪个程序仍然可以正确执行?请说明原因
答:task5可以正确执行,“end start”的作用是指明程序的入口,若不指明程序入口,CPU则将按顺序执行,在内存中数据和指令都是以数据的形式存储,CPU无法自动识别哪些是指令哪些是数据,task3,task4在code段前都有数据段,据段的数据会被当成指令被编译执行,虽然可能也会正确运行但会产生一些错误,task5中code段位于开头,按顺序执行可以正确执行。
验证:
由上图可知,只有task63正确执行。
完整源代码文件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 ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称 db 8 dup(0) c1 ends code segment start: mov ax,a mov ds,ax mov ax,c1 mov es,ax mov bx,0 mov cx,8 s: mov ax,0 add al,[bx] add al,[bx+16] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end start
在debug环境中,执行到程序返回前,查看逻辑段c的数据:
原始:
执行后:
完整源代码文件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 ss,ax mov sp,16 mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
在debug环境中,执行到程序返回前,查看逻辑段c的数据
执行前:
执行后:
原文:https://www.cnblogs.com/christian666/p/14044027.html