鱼C论坛

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

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

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

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

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

x
  1. assume cs:codesg,ss:stacksg
  2. data segment
  3.     db '1975','1976','1977','1978','1979','1980','1981','1982','1983'  
  4.     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5.     db '1993','1994','1995'
  6.     ;以上是表示21年的21个字符串,(数组)(0-53h)

  7.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  8.     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  9.     ;以上是表示21年公司总收入的21个数据(54h-0A7h)

  10.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  11.     dw 11542,14430,15257,17800
  12.     ;以上是表示21年公司雇员人数的21个word型数据(0A8h-0D1h)
  13. data ends

  14. table segment
  15.     db 21 dup ('year summ ne ?? ')
  16. table ends

  17. stacksg segment
  18.     dw 16 dup(0)
  19. stacksg ends

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

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

  26.         mov ax,stacksg
  27.         mov ss,ax
  28.         mov sp,16

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

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

复制代码



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

使用道具 举报

 楼主| 发表于 2022-4-24 20:30:53 | 显示全部楼层
写python缩进写习惯了,不对齐不舒服
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-7 14:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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