学习记录-汇编语言之实验七

这个实验刚做的开始有点问题,搁置了几天,今天做了修改,感谢大佬的文章。

总体思路:这是个关于寻址方式的实验,年份和收入为四个字节,雇员为两个字节,年份和收入可共用一个寄存器di,用[di+idata]方式区分,雇员数可用si定位,dx表示行数,每次换行dx+10H,di+4,si+2。bx控制换行,[di+idata]负责指向下一个年份数据及总收入数据,[si]负责指向下一个雇员人数。

1.题目框架

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'
	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

codesg segment
start:

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


           

2.设置段寄存器

    mov bx,data     设置ds指向(取数据处)
	mov ds,bx

	mov bx,table    设置es指向(存数据处)
	mov es,bx

    mov si,0
    mov di,0


3.21行循环21次

    mov cx,21    共21年的数据;
  s:(留白)


    add bx,10H    调整行数
    add di,4      调整di、si指向下一个数据
    add si,2
    loop s

4.复制年份

    mov ax,[di]       年份前两个字节;
	mov es:[bx],ax    bx标记行数
    mov ax,[di+2]     年份后两个字节;
    mov es:[bx+2],ax  +2指向bx行具体位置

5.复制总收入

    mov ax,[di+84]     存储被除数低16位;
    mov es:[bx+5],ax
    mov dx,[di+84+2]   存储被除数高16位; 注:div规则:被除数为32位时,ax存储低16位,dx存储高16位
    mov es:[bx+7],dx

6. 复制雇员人数

    mov bp,[si+168]
    mov es:[bx+10],bp

7. 计算人均收入并存入

    div bp
    mov es:[bx+13],ax

8.汇总

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'
	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

codesg segment
start:
    mov ax,data     设置ds指向(取数据处)
	mov ds,ax

	mov ax,table    设置es指向(存数据处)
	mov es,ax

    mov si,0
    mov di,0

    mov cx,21    共21年的数据;
  s:mov ax,[di]       年份前两个字节;
	mov es:[bx],ax    bx标记行数
    mov ax,[di+2]     年份后两个字节;
    mov es:[bx+2],ax  +2指向bx行具体位置

    mov ax,[di+84]     存储被除数低16位;
    mov es:[bx+5],ax
    mov dx,[di+84+2] 存储被除数高16位; 注:div规则:被除数为32位时,ax存储低16位,dx存储高16位
    mov es:[bx+7],dx

    mov bp,[si+168]
    mov es:[bx+10],bp

    div bp
    mov es:[bx+13],ax

    add bx,10H    调整行数
    add di,4      调整di、si指向下一个数据
    add si,2
    loop s

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值