lab7

  1. assume cs:code
  2. data segment
  3. db '1975','1976','1977','1978','1979','1980','1978','1982','1983'
  4. db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5. db '1993','1994','1995'
  6. ;以上是21年的21个字符串
  7. ;21*4 = 84 个字节
  8. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,19514
  9. dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  10. ;以上是表示公司21年收入的21dword数据 21*4 = 84
  11. dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  12. dw 11542,14430,15257,17800
  13. ;以上是21年雇佣人数的21word数据 21*2 = 42
  14. data ends
  15. table segment
  16. db 21 dup ('year summ ne ?? ')
  17. table ends
  18. code segment
  19. ;ds datasg , es tablesg
  20. ;在ds段中, bx指年份 , si指收入, di 人数
  21. ;在es段中, 可以用idata 确定每个内容, 然后用bp去动
  22. start: mov ax,data ;得到段
  23. mov ds,ax
  24. mov ax,table
  25. mov es,ax
  26. mov bx,0 ;data段指针
  27. mov si,84
  28. mov di,168
  29. mov bp,0 ;table段指针
  30. mov cx,21
  31. ;复制年份
  32. yeare: push [bx]
  33. pop es:[bp]
  34. push [bx+2]
  35. pop es:[bp+2]
  36. ;复制收入
  37. mov ax,ds:[si]
  38. mov dx,ds:[si+2]
  39. mov es:[bp+5],ax
  40. mov es:[bp+2+5],dx
  41. ;复制员工数
  42. push ds:[di]
  43. pop es:[bp+0ah]
  44. ;除法
  45. div word ptr ds:[di]
  46. mov es:[bp+00dh],ax
  47. add si,4
  48. add bx,4
  49. add di,2
  50. add bp,16
  51. loop yeare
  52. mov ax,4c00h
  53. int 21h
  54. code ends
  55. end start

image.png
对这道题做一个小小的总结

分析数据的来源:

用 ds 定位data段
用 es 定位table段

在 data 段内, 可以用 idata 去确定段内不同的类型

然后用 bx, di, si 去在不同类型中 做指向具体数据的指针

ds: [idata + 寄存器指针]

在table 段内, 用 idata 去指向不同的内容, 用 指针bp 确定第几段数据

es:[idata +bp]

总的来说, 确定一个数据的位置, 我们先想清楚 用什么存一个段 , 如果 段中不同的数据长度确定的话, 可以用 idata 把这个段划分成几个段, 然后再用 寄存器 bx, si, di , bp作为每个段内的指针

关于除法:
在确定要进行除法时, 先确定除数和被除数的大小, 合理的存储被除数和除数, 如果除数是 16位的数, 那么被除数就是32位的数, 其高16位存在 dx 寄存器中, 低 16位存在 ax寄存器中, 商的结果存在ax寄存器中, 余数存在 bx寄存器中. 除数如果是 8位, 则被除数存在ax中, 商的结果存在al中, 余数存在 ah 中

对寄存器的复习:

段寄存器: ds , es , ss

可以在[ ]中使用的寄存器: si , di , bp(默认对应的段寄存器是ss) , bx

循环: cx ( 可以用栈结构来暂存多个 cx )