码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-07-01 20:43:16      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:start   地址   span   结束   table   load   bsp   访问   tab   

例子:

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

 运行结果:

技术图片

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

标签:start   地址   span   结束   table   load   bsp   访问   tab   

原文地址:https://www.cnblogs.com/csuchenzc/p/13220979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!