DS=076A;SS=076B;CS=076C;data=x-2;stack=x-1;(每段16个字节)
DS=076A;SS=076B;CS=076C;data=x-2;stack=x-1;(每段16字节)
任务1-3
DS=076A;SS=076B;CS=076C;data=x-4;stack=x-2;(每段32字节)
任务1-4
DS=076C;SS=076E;CS=076A;data=x+2;stack=x+4;(ds-076c,ss-076e)
任务1-5
问题1:实际分配空间为16*(N/16向上取整),总是为16的倍数。
问题2:task1-4可以运行,因为start指明了代码段的起始位置,end后去除start后自动从程序开头执行;而只有1-4中指令从程序开头开始,其他为数据段开始会错误识别成指令,无法执行;
2.实验任务2
编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数据03 04assume cs:code code segment start: mov ax,0b800h mov ds,ax mov bx,0f00h mov cx,50h mov ax,0403h s: mov ds:[bx],ax add bx,2 loop s mov ah,4ch int 21h code ends end start
运行结果:
3.实验任务3
编程实现把逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中。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 bx,0 mov cx,10 s: mov ax,[bx] add ax,[bx+10h] mov [bx+20h],ax inc bx loop s mov ah,4ch int 21h code ends end start
运行结果:
data1-0000; data2-0010; data3-0020;
4.实验任务4
assume cs:code data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(0) data2 ends code segment start: mov ax,data1 ;data1为数据段 mov ds,ax mov ax,data2 ;data2为栈段,长度与data1相同 mov ss,ax mov sp,10h mov bx,0 mov cx,8 s0: push ds:[bx] ;全部入栈后栈顶为data2的段首,data2正好为data1的逆序存放 add bx,2 loop s0 mov ah, 4ch int 21h code ends end start
运行结果:
5.实验任务5
代码分析:
assume cs:code, ds:data data segment db 'Nuist' db 1, 2, 3, 4, 5 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] ;al逐个赋值data第一行的一个字母 and al, 0dfh ;0dfh=0000 1101 1111,相与运算将小写字母ASCII值减32变为大写字母 mov es:[di], al mov al, [5+si] ;al赋值data第二行数字 mov es:[di+1], al ;插入到字母后面 inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
运行结果:
问题3:line19作用:
0dfh=0000 1101 1111,相与运算将小写字母ASCII值减32变为大写字母
问题4:修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
运行结果:db 5 dup(2)
db 5 dup(5)
结论:改变其前面字母的颜色;
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 es,ax mov di,0 mov cx,4 s0: mov bx,cx ;嵌套循环,外循环cx值保存在bx中 mov si,di mov cx,4 ;内循环对没行前四个字母操作 s1: mov al,es:[si] or al,20h ;或运算20h=0010 0000 大写的字母ASCII码值加32变小写 mov es:[si],al inc si loop s1 add di,10h mov cx,bx ;内循环结束,cx赋值外循环的计数 loop s0 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' dd 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 cx,5 mov bx,0 mov si,0 s0: mov ax,[bx] ;s0传入年份 mov es:[si+0],ax mov ax,[bx+2] mov es:[si+2],ax add bx,4 add si,10h loop s0 mov cx,5 mov bx,14h mov si,0 s1: mov ax,[bx] ;s1传入收入 mov es:[si+5],ax mov ax,[bx+2] mov es:[si+7],ax add bx,4 add si,10h loop s1 mov cx,5 mov bx,28h mov si,0 s2: mov ax,[bx] ;传入雇员 mov es:[si+10],ax add bx,2 add si,10h loop s2 mov cx,5 mov si,0 s3: mov ax,es:[si+5] ;计算人均收入,32收入低位ax mov dx,es:[si+7] ;32收入高位dx mov bx,es:[si+10] ;雇员 div bx mov es:[si+13],ax ;取商放在ax中 add si,10h loop s3 mov ah, 4ch int 21h code ends end start
运行结果:
代码:
结果:
执行前:
40~80显示为空格
执行后:
40~80前四列显示为年份,6~9列值列为收入,11,12列值为雇员,14,15列值为均收入;
结果表:
1~4年份 | 6~9收入 | 11,12雇员 | 14,15均收入 | |
40 | 1975 | 0010h | 03 | 05 |
50 | 1976 | 0016h | 07 | 03 |
60 | 1977 | 017eh | 09 | 2a |
70 | 1978 | 054ch | 0d | 68 |
80 | 1979 | 0956h | 1c | 55 |
四、实验总结
通过本次实验,我学习了伪指令start的作用;多段程序的内存分配方式;利用字符前数字改变字符颜色;利用与或运算改变字符大小写;div指令的运用;