汇编实验:寻址方式在数据访问中的应用

例子:

assume cs:codesg

datasg segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
    db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
    ;表示21年的21个字符串

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827
    dd 803530,1183000,1843000,2759000,3753000,4649000,5937000
    ;21年总收入的21个dword数据

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800
    ;表示21年公司雇员人数的21个数据
datasg ends

table segment
    db 21 dup ('year summ ne ?? ')
table ends

将data段中的数据按如下格式写入table中:

 代码如下:

assume cs:codesg

datasg segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
    db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
    ;表示21年的21个字符串

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827
    dd 803530,1183000,1843000,2759000,3753000,4649000,5937000
    ;21年总收入的21个dword数据

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800
    ;表示21年公司雇员人数的21个数据
datasg ends

table segment
    db 21 dup ('year summ ne ?? ')
table ends

stacksg segment
    db 16 dup (0)
stacksg ends

codesg segment
start:  mov ax,datasg
        mov ds,ax
        mov ax,table
        mov es,ax
        mov ax,stacksg

        mov ss,ax
        mov sp,16
        ;栈用来储存CX中的数据来进行双重循环
        mov cx,21
        mov bx,0
        ;BX储存table段中每行的内存单元,0<=(BX)<=F,所以每次循环BX要清0
        mov di,0
        ;DI用来访问储存公司收入的数据段
        mov si,0
        ;SI用来访问储存公司员工数量的数据段
        mov bp,0
        ;BP用来访问储存公司年份的数据段

    s0: push cx
        mov cx,4
        mov bx,0

    s1: mov al,ds:[bp]
        mov es:[bx],al
        inc bp
        inc bx
        loop s1
        ;第一次循环完毕BP会指向下一个年份的首地址,BX会指向table:04H,下面将空格输入此单元格

        mov al,' '
        mov es:[bx],al
        inc bx

        mov ax,ds:[si+84]
        ;21个年份字符串,每个年份有4个数字字符,共占84Byte,si = 0时ds:[si+84]指向第一年公司收入
        mov es:[bx],ax
        add bx,2
        add si,2
        mov ax,ds:[si+84]
        mov es:[bx],ax
        add si,2
        add bx,2
        ;此代码段结束时si += 4,ds:[si+84]指向下一年收入

        mov al,' '
        mov es:[bx],al
        inc bx

        mov ax,ds:[di+168]
        mov es:[bx],ax
        add di,2
        add bx,2

        mov al,' '
        mov es:[bx],al
        
        mov ax,es:[5]
        mov dx,es:[7]
        div word ptr es:[0ah]
        ;注意一下被除数32位除法的规则
        mov es:[0dh],ax

        mov al,' '

        mov es:[bx],al
        mov ax,es
        inc ax
        mov es,ax
        ;在第一次循环结束时给es自增1,使其指向table:10H,在以后的循环同理
        ;让其指向“下一行”

        pop cx
        loop s0

        mov ax,4c00h
        int 21h
codesg ends
end start

 运行结果:

posted @ 2020-07-01 19:09  CSULuyao  阅读(276)  评论(0编辑  收藏  举报