- 实验内容、程序清单及运行结果
- 课本实验7 寻址方式在数据化数据访问中的应用
题目:编程,将data段中的数据按照指定格式写到table段中。
题目代码如下
assume cs:code,ds:data,ss:stack
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
解:
实现思路:
(1)设置段寄存器
(2)复制“年份”数据
(3)复制“年总收入”数据
(4)复制“雇员人数”数据
(5)计算“人均收入”
综上所述最终代码:
assume cs:code,ds:data,ss:stack
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
stack segment
db 0
stack ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
start:
mov ax,data ;段寄存器设置
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10H
add ax,1H
mov es,ax
mov bx,0 ;复制 年份
mov di,0
mov cx,21
s0:
push cx
mov si,0
mov cx,4
s:
mov al,ds:[di]
mov es:[bx+si],al
inc si
inc di
loop s
add bx,10H
pop cx
loop s0
mov bx,0 ;复制 年总收入
mov si,5
mov cx,21
s1:
push cx
mov cx,4
s9:
mov al,ds:[di]
mov es:[bx+si],al
inc si
inc di
loop s9
add bx,10H
mov si,5
pop cx
loop s1
mov bx,0 ;复制 雇员人数
mov si,0aH
mov cx,21
s2:
push cx
mov cx,2
s99:
mov al,ds:[di]
mov es:[bx+si],al
inc si
inc di
loop s99
add bx,10H
mov si,0aH
pop cx
loop s2
mov bx,0 ;计算 人均收入
mov si,0dH
mov cx,21
s3:
mov ax,es:[bx+5]
mov dx,es:[bx+7]
div word ptr es:[bx+0aH]
mov es:[bx+si],ax
add bx,10H
loop s3
mov ax,4c00H ;程序返回
int 21H
code ends
end start
2、数据段的第一个串为学生本人的姓名拼音小写,转变为大写字母后存入它后面的数据区。例如
DATA SEGMENT
NAME1 DB ‘liweihua’
NAME2 DB 8 DUP (0)
DATA ENDS
DATA SEGMENT
NAME1 DB 'zengyongsheng'
NAME2 DB 13 DUP (0)
DATA ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
mov bx,0
mov cx,13 ;总共13个字母
s:mov al,[bx]
and al,11011111B ;第五个位置0变大写
mov [bx+13],al
inc bx ;一个个字母改写
loop s
MOV AH,4CH
INT 21H
CODES ENDS
END START
3、定义下面的4行4列矩阵数组,要求将上三角的所有元素累加,结果存入SUM。
X1 DB 10,20,30,40
DB 20,30,40,50
DB 30,40,50,60
DB 40,50,60,70
SUM DW 0
DATAS SEGMENT
X1 DB 10,20,30,40
DB 20,30,40,50
DB 30,40,50,60
DB 40,50,60,70
SUM DW 0
DATAS ENDS
STACKS SEGMENT
dw 8 dup (0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov cx,4
mov dx,0
mov bx,0
s1:push cx ;双层循环,实现4次bx++,3次bx++等等
s:mov ah,0
mov al,[x1+bx]
add [sum],ax
inc bx
loop s ;注意跳出循环时cx=0
inc dx ;第一行跳0个,第二行跳1个,第三行跳2个等等
add bx,dx ;bx+dx选择上三角,跳过下三角
pop cx
loop s1
MOV AH,4CH
INT 21H
CODES ENDS
END START
(4)杨辉三角
创建一个10行16列的字节数组,并按照杨辉三角的数学规律给数组赋值。杨辉三角形状如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
DATAS SEGMENT
yh db 10*16 dup (0)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
mov [yh],1 ;第一行只有1个1
mov cx,9 ;剩下9行
mov bx,16
mov si,1
s:mov [yh+bx],1
mov [yh+bx+si],1
inc si
add bx,16 ;将第一列赋1,将每行最后一个数赋1
loop s
mov cx,121 ;由杨辉三角算出相加的次数,从第三行第二列到最后一个,15+16*6+10
mov bx,33
s1:mov al,[yh+bx-17]
add al,[yh+bx-16]
mov [yh+bx],al ;杨辉三角的规律[bx]=[bx-17]+[bx-16]
inc bx
loop s1
MOV AH,4CH
INT 21H
CODES ENDS
END START