lab7
assume cs:codedata segmentdb '1975','1976','1977','1978','1979','1980','1978','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995';以上是21年的21个字符串;21*4 = 84 个字节dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,19514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;以上是表示公司21年收入的21个dword数据 21*4 = 84dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;以上是21年雇佣人数的21个word数据 21*2 = 42data endstable segmentdb 21 dup ('year summ ne ?? ')table endscode segment;ds指 datasg , es指 tablesg;在ds段中, 用bx指年份 , 用si指收入, 用di指 人数;在es段中, 可以用idata 确定每个内容, 然后用bp去动start: mov ax,data ;得到段mov ds,axmov ax,tablemov es,axmov bx,0 ;data段指针mov si,84mov di,168mov bp,0 ;table段指针mov cx,21;复制年份yeare: push [bx]pop es:[bp]push [bx+2]pop es:[bp+2];复制收入mov ax,ds:[si]mov dx,ds:[si+2]mov es:[bp+5],axmov es:[bp+2+5],dx;复制员工数push ds:[di]pop es:[bp+0ah];除法div word ptr ds:[di]mov es:[bp+00dh],axadd si,4add bx,4add di,2add bp,16loop yearemov ax,4c00hint 21hcode endsend start

对这道题做一个小小的总结
分析数据的来源:
用 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 )
