• 汇编语言: 实验七 寻址方式在结构化数据访问中的应用


    第一次做 比较烂的实现:

    assume cs:code,ds:data,ss:stack
    data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
    db '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

    stack segment        //stack 存变量
    dw 0,0,0,0,0,0,0,0
    stack ends

    code segment
    start:
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax
    mov ax,stack
    mov ss,ax
    mov sp,16

    mov bx,0
    mov cx,21
    mov bp,0
    mov di,0
    mov si,0
    s0:
    push cx
    push si
    mov si,0
    mov cx,4
    s:
    mov al,ds:[bp]
    mov es:[bx].0H[si],al
    inc bp
    inc si
    loop s

    mov ax,ds:84[di]
    mov es:[bx].0H[5],ax
    push ax
    add di,2
    mov ax,ds:84[di]
    mov es:[bx].0H[7],ax
    mov dx,ax
    pop ax
    add di,2

    pop si
    push ax
    mov ax,ds:168[si]
    mov es:[bx].0H[10],ax
    pop ax
    div word ptr ds:168[si]
    mov es:[bx].0H[13],ax
    add si,2

    add bx,10H
    pop cx
    loop s0

    mov ax,4c00H
    int 21H
    code ends
    end start

    看了答案之后,按照答案的逻辑重写了一遍:

    assume cs:code,ds:data,es:table
    data segment
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983'        ;年份数据,每年占4字节
        db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
        db '1993','1994','1995'
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514        ;收入数据,每年占4字节
        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    ;人数数据,每年占2字节
        dw 11452,14430,15257,17800
    data ends
    table segment
        db 21 dup ('year summ ne ?? ')
    table ends
    code segment  
    start:

    mov ax,data
    mov ds,ax       ;ds放data数据
    mov ax,table
    mov es,ax    ;es放table数据

    mov bx,0    ;bx存放 年份和收入的偏移指针(由于年份和收入每年都是占4字节,所以可以用同一个偏移指针)
    mov si,0    ;si存放 人数偏移指针,每年增加2字节
    mov di,0    ;di存放 table段中偏移指针,每年增加16字节

    mov cx,21    ;循环21年
    s:
    ;开始处理年份
    mov ax,ds:[bx]    ;bx处年份的前2个字节
    mov es:[di],ax    ;把2个字节写入table中
    mov ax,ds:[bx+2];把后2个字节放入ax
    mov es:[di+2],ax;写入table

    ;开始处理收入
    mov ax,ds:84[bx];每一年份的年份数据和收入数据相差84字节
    mov es:[di+5],ax;写入字节
    mov dx,ds:86[bx];放在高位中
    mov es:[di+7],dx

    ;先做除法,填写好平均工资,省去保存的麻烦
    div word ptr ds:168[si] ;dxax除以168[si]表示的人数
    mov es:[di+13],ax    ;ax中存的商值放入每行13位置处

    ;开始处理人数
    mov ax,ds:168[si]
    mov es:[di+10],ax

    add bx,4    ;bx每年加4个字节
    add si,2    ;si每年加2个字节
    add di,16    ;di每年加16个字节

    loop s

    mov ax,4c00H
    int 21H
    code ends
    end start

  • 相关阅读:
    毒丸模式【其他模式】
    对象池模式【其他模式】
    双重校验锁模式【其他模式】
    回调模式【其他模式】
    命令模式【行为模式】
    备忘录模式【行为模式】
    Linux
    Cassandra Package installation directories
    cqlsh script
    Spring boot cassandra
  • 原文地址:https://www.cnblogs.com/superzhao/p/4652816.html
Copyright © 2020-2023  润新知