寻址方式在结构化数据访问中的应用

  • 实验内容、程序清单及运行结果
  1. 课本实验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 4050,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

1、将姓名从小写转换为大写并存入数据区: ``` DATA SEGMENT NAME1 DB 'liweihua' NAME2 DB 8 DUP (0) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX ; 将姓名从小写转换为大写 MOV SI, OFFSET NAME1 MOV DI, OFFSET NAME2 MOV CX, 8 UP_LOOP: LODSB CMP AL, 61H ; 判断是否为小写字母 JB NEXT CMP AL, 7AH JA NEXT SUB AL, 20H ; 转换为大写字母 NEXT: STOSB LOOP UP_LOOP MOV AH, 4CH INT 21H CODE ENDS ``` 2、累加上三角的所有元素: ``` DATA SEGMENT X1 DB 10, 20, 30, 40, 20, 30, 40, 50, 30, 40, 50, 60, 40, 50, 60, 70 SUM DW 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX ; 累加上三角的所有元素 MOV AX, 0 MOV BX, 0 MOV CX, 4 ROW_LOOP: MOV DX, BX ADD DX, 1 COL_LOOP: ADD AX, [X1+BX] ADD BX, 1 LOOP COL_LOOP ADD BX, DX LOOP ROW_LOOP MOV [SUM], AX MOV AH, 4CH INT 21H CODE ENDS ``` 3、创建10行16列的字节数组,并按照杨辉三角的数学规律给数组赋值: ``` DATA SEGMENT TRIANGLE DB 10*16 DUP (0) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX ; 初始化第一行为1 MOV DI, OFFSET TRIANGLE MOV AL, 1 MOV [DI], AL ADD DI, 2 MOV CL, 15 ROW_LOOP1: MOV [DI], AL ADD DI, 2 LOOP ROW_LOOP1 ; 依次计算每一行的值 MOV BX, 1 MOV CX, 1 MOV DX, 0 ROW_LOOP2: MOV [DI], AL ADD DI, 2 ADD DX, BX CMP CX, 10 JE EXIT_LOOP COL_LOOP: MOV AX, [DI-16] ADD AX, [DI-14] MOV [DI], AX ADD DI, 2 LOOP COL_LOOP MOV [DI], AL ADD DI, 2 ADD BX, 1 ADD CX, 1 JMP ROW_LOOP2 EXIT_LOOP: MOV AH, 4CH INT 21H CODE ENDS ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值