汇编语言 王爽 实验7 寻址方式在结构化数据访问中的应用

Power idea公司从1975年成立一直到1995年的基本情况如下表所示。

1
下面的程序中,已经定义好了这些数据:

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'
        ;以上是表示21年的21个字符串

        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,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个word型数据
data ends

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

编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。

1
提示,可将data段中的数据看成是多个数组,而将table中的数据看成是一个结构型数据的数组,每个结构型数据中包含多个数据项。可用bx定位每个结构型数据,用idata定位数据项,用si定位数组项中的每个元素,对于table中的数据的访问可采用[bx].idata和[bx].idata[si]的寻址方式。

注意,这个程序是到目前为止最复杂的程序,它几乎用到了我们以前学过的所有知识和编程技巧。所以,请认真完成。

assume cs:codesg,ds:data

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'
        ;以上是表示21年的21个字符串

        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,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个word型数据
data ends

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

stack segment                      ;该栈用于保存临时变量
    dw 0,0,0,0,0,0,0,0
stack ends

codesg segment
    
    start:
    mov ax,stack                   ;设置栈寄存器
    mov ss,ax
    mov sp,8
    
    mov ax,data                    ;设置段寄存器ds,用于指向数据段的段首位置
    mov ds,ax
    mov si,0                       ;si用于指向数据段中的年和公司的总收入
                                   
    mov ax,table                   ;设置段寄存器es,用于指向表格段的段首位置
    mov es,ax
    mov di,0                       ;用于定位表格中的每个属性的起始地址
    
    mov ax,0a8h
    mov bp,ax                      ;bp用于指向雇员人数的起始地址
    
    mov cx,21
  s:mov ax,ds:[bx+si]              ;将数据段中的年传送到表格段中的year位置
    mov dx,ds:[bx+si+2]
    mov es:[di],ax
    mov es:[di+2],dx
    
    push si                        ;用栈临时保存寄存器si的值
    add si,54H                     ;将数据段中的公司总收入传送到表格段中的summ位置
    add di,5
    mov ax,ds:[bx+si]
    push ax
    mov dx,ds:[bx+si+2]
    push dx
    mov es:[di],ax
    mov es:[di+2],dx
                         
    add di,5                       ;将数据段中的雇员数传送到表格段中的ne位置
    mov ax,ds:[bp]
    mov es:[di],ax
    
    add di,3                       ;计算各年的平均工资
    pop dx
    pop ax
    div word ptr ds:[bp]
    mov es:[di],ax                 ;将平均工资传送到表格段中的??位置
                                   
    pop si                         ;恢复寄存器si的值
    add si,4                       ;将si指向下一年和下一年的总收入
    add di,3                       ;将di指向表格中的下一个属性的起始位置
    add bp,2                       ;将bp指向下一年的雇员数
    loop s
    
    mov ax,4c00h
    int 21h
    
codesg ends

end start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值