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


    例子:

    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

     运行结果:

  • 相关阅读:
    【Prince2科普】Prince2的七大原则(6)
    6.08 PMO的生存挑战-这些企业的痛你遇到了吗?
    【Prince2科普】Prince2的七大原则(5)
    【Prince2科普】Prince2的七大原则(4)
    【Prince2科普】Prince2的七大原则(3)
    【Prince2科普】Prince2的七大原则(2)
    项目管理三大认证体系,该选择谁?
    事件委托
    关于js中pushstate popstate
    js中标签的获取
  • 原文地址:https://www.cnblogs.com/csuchenzc/p/13220979.html
Copyright © 2020-2023  润新知