1.任务一
1-1
汇编并连接task1_1.asm
用g命令打断点,使程序执行至17行停止,查看寄存器的值
(1)ds=076A;
ss=076B;
cs=076C;
(2)ds=X-0002;
ss=X-0001;
1-2
(1)ds=076A
ss=076B;
cs=076C;
(2)ds=X-0002;
ss=X-0001;
1-3
(1)ds=076A
ss=076C;
cs=076E;
(2)ds=X-0004;
ss=X-0002;
1-4
(1)ds=076C;
ss=076E;
cs=076A;
(2)ds=X+0002;
ss=X+0004;
1-5
(1)如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为 (n+15)/16,即对N/16向上取整,因为段大小为16字节整数倍,不满的部分也要补足16字节。
(2)
只有1-4可以执行,原因如下:
start标号表示程序段的开始,end start表示程序段结束,start和end start必须成对出现,如果end start不存在,则忽略start标号,当作缺省处理。当程序开头即为程序入口时,可以缺省。
只有1-4的开头是代码段,所以只有1-4可以执行。
2.任务2
代码如下:
assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,0f00h mov cx,80 p: mov ds:[bx],0403h inc bx inc bx loop p mov ah,4ch int 21h code ends
结果如下:
3.任务3
代码如下
assume cs:code data1 segment db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers data1 ends data2 segment db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers data2 ends data3 segment db 16 dup(0) data3 ends code segment start: mov ax,data1 mov ds,ax mov ax,data2 mov es,ax mov ax,data3 mov ss,ax mov bx,0 mov cx,10 s: mov ax,0 add ax,ds:[bx] add ax,es:[bx] mov ss:[bx],ax inc bx loop s mov ax,4c00h int 21h code ends end start
未进入代码段时的值
data1为076a:0000开始的10个单元,data2,data3分别从076b,076c开始,可以看到076c此时全为0
运行后,076c结果如下
变成了data1+data2
4.任务4
代码如下:
assume cs:code data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(?) data2 ends code segment start: mov ax,data1 mov ds,ax mov ax,data2 mov ss,ax mov cx,8 mov sp,16 mov bx,0 s: mov ax,[bx] push ax inc bx inc bx loop s mov ah, 4ch int 21h code ends end start
进入代码段前:
代码段运行完毕后
5.任务5
运行程序
执行到25、27行之间
line 19 作用
将data1中内存单元值与0dfh即16进制数df进行与运算,而df化成二进制为11011111,与运算将第6位原本的数字变成0,
大写字母ascii范围01000001~01011010,小写字母为01100001-01111010,所以将小写字母第6位的1变更成0,即可小写转大写,
而大写字母原本的0不变,所以第19行将所有字母变成大写。
改为db 5 dup(2)
结果如下:
一个字符占一个字,即2字节,低位字节表示ascii吗,高位字节表示字符参数,高4位底色,第4位字符本身颜色。
6.任务6
assume cs:code, ds:data data segment db 'Pink Floyd ' db 'JOAN Baez ' db 'NEIL Young ' db 'Joan Lennon ' data ends code segment start: mov ax,data mov ds,ax mov cx,4 mov bx,0 s: mov dx,cx mov cx,4 mov si,0 p: mov al,ds:[bx+si] or al,00100000B mov ds:[bx+si],al inc si loop p add bx,16 mov cx,dx loop s mov ah, 4ch int 21h code ends end start
7.任务7
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' dw 16, 22, 382, 1356, 2390 dw 3, 7, 9, 13, 28 data ends table segment db 5 dup( 16 dup(' ') ) ; table ends code segment start: mov ax,data mov ds,ax mov ax,table mov es,ax mov bx,0 mov si,0 mov cx,5 p: mov ax,ds:[bx] mov es:[si],ax mov ax,ds:[bx+2] mov es:[si+2],ax add bx,4 add si,16 loop p mov bx,20 mov cx,5 mov si,5 s: mov ax,0 mov es:[si+2],ax mov ax,ds:[bx] mov es:[si],ax add bx,2 add si,16 loop s mov bx,30 mov cx,5 mov si,10 q: mov ax,ds:[bx] mov es:[si],ax add bx,2 add si,16 loop q mov cx,5 mov si,0 r: mov ax,es:[si+5] mov dx,es:[si+7] div word ptr es:[si+10] mov es:[si+13],ax add si,16 loop r mov ah, 4ch int 21h code ends end start
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' dw 16, 22, 382, 1356, 2390 dw 3, 7, 9, 13, 28 data ends table segment db 5 dup( 16 dup(' ') ) ; table ends code segment start: mov ax,data mov ds,ax mov ax,table mov es,ax mov bx,0 mov si,0 mov cx,5 p: mov ax,ds:[bx] mov es:[si],ax mov ax,ds:[bx+2] mov es:[si+2],ax add bx,4 add si,16 loop p mov bx,20 mov cx,5 mov si,5 s: mov ax,0 mov es:[si+2],ax mov ax,ds:[bx] mov es:[si],ax add bx,2 add si,16 loop s mov bx,30 mov cx,5 mov si,10 q: mov ax,ds:[bx] mov es:[si],ax add bx,2 add si,16 loop q mov cx,5 mov si,0 r: mov ax,es:[si+5] mov dx,es:[si+7] div word ptr es:[si+10] mov es:[si+13],ax add si,16 loop r mov ah, 4ch int 21h code ends end start
运行前后:
实验总结:
1.通过本次实验,掌握了循环loop的用法。
2.了解了通过与、或运算改变字母大小写的方法
3.了解了字符在内存中的存储方式。