鱼C论坛

 找回密码
 立即注册
查看: 1484|回复: 1

【汇编语言】第八章实验七答案

[复制链接]
发表于 2022-4-24 20:29:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:codesg,ss:stacksg
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个字符串,(数组)(0-53h)

    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个数据(54h-0A7h)

    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型数据(0A8h-0D1h)
data ends

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

stacksg segment
    dw 16 dup(0)
stacksg ends

codesg segment
start:  
        mov ax,data
        mov ds,ax ;将data数据的段地址给段寄存器ds

        mov ax,table
        mov es,ax ;将table段的短地址给es,ds已经被data段占用

        mov ax,stacksg
        mov ss,ax
        mov sp,16

        mov bx,0
        mov si,0
        mov di,0
        mov bp,0
        mov cx,21 ;初始化各寄存器的值
;========================================
            s1:    
                    push cx ;让cx入栈,地址ss:000eh
                    mov cx,2    ;这里循环连词是为了将年份和收入分两次读取并写进table,因为每年收入和年份都是四个字节,寄存器一次只能读取两个字节
                        s2:     
                                mov ax,[si]        ;将年份读取到ax,先读取两个字节,例如1975年,第一次读取‘19’,下一次读取‘75’
                                mov es:[bx+di],ax  ;将年份写进table,分两次写入
                                mov ax,[si+54h]    ;因为用‘dd’定义,即每年收入占四个字节,和年份一样,用idata定位,与年份一起读取写入
                                mov es:[bx+di+5],ax     ;将年份写入table,分两次
                                add si,2           ;累加两位,读取下一个年分,例如1975在内存中为31,39,37,35;第一次是ds:[0],读取两个字节31,39;下次要读ds:[2],即37,35
                                add di,2           ;和上面同理
                        loop s2
                    mov di,0    ;di这里要初始化为0,因为是用来定位table里面的写入位置,不像si是定位data里面数据的读取位置,不能一直累加
                    add bx,16   ;跳到table的下一行,开始写新的一行
                    pop cx
            loop s1     ;s1循环的作用是将年份和收入写进table,而员工人数和人均工资不在这面

        mov bx,0
        mov si,0
        mov di,0
        mov bp,0
        mov cx,21   ;初始化各寄存器的值,开始把员工人数写进table
            s3:     
                    mov ax,[0A8h+si]    ;这里不用再分两次读取,因为就两个字节,寄存器一次就可以搞定
                    mov es:[bx+0ah],ax  ;写入table
                    add si,2            ;累进
                    add bx,16           ;下一行
            loop s3
        mov bx,0
        mov si,0
        mov di,0
        mov bp,0
        mov cx,21   ;初始化各寄存器的值,开始写入工资
            s4:
                    mov ax,[54h+si]     ;低16位写入ax
                    mov dx,[56h+si]     ;高16位写入dx
                    div word ptr ds:[0A8h+di]   ;word ptr 是为了让电脑知道我们要进行被除数是32位的触发,((dx)*10000h+(ax))/(ds:[0A8h+di])
                    mov es:[bx+0Dh],ax          ; 被除数位32位,求得的商储存在ax中,写入table
                    add si,4            ;加4是因为下一年收入的低十六位与今年收入的低十六位相距4个字节单元
                    add di,2            ;di加2是因为人工数是用dw定义的,即每一年的员工数站两个字节单元
                    add bx,16           ;写下一行
            loop s4
;========================================
        mov ax,4c00h
        int 21h         ;返回函数
codesg ends
end start


如果有错误的地方请纠正,应为还有很多优化的地方,后面会再发一个优化的出来,这个总觉得有点繁琐
不会是前面的所学的基本都要用到,太难了,花了好几个小时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-24 20:30:53 | 显示全部楼层
写python缩进写习惯了,不对齐不舒服
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 19:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表