最开始写的有很多循环的(容易理解,但复杂性高)
assume cs:code,ss:stack 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 stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,data mov ds,ax mov ax,table mov es,ax mov ax,stack mov ss,ax mov sp,10h mov bx,0 mov bp,0 mov cx,21 s:push cx mov si,0 mov cx,4 s0:mov al,[bx+si] mov es:[bp+si],al inc si loop s0 mov al,' ' mov es:[bp+si+1],al add bx,4 add bp,16 pop cx loop s mov bx,84 mov bp,5 mov cx,21 s1:mov ax,ds:[bx] mov dx,ds:[bx+2] mov es:[bp],ax mov es:[bp+2],dx mov al,' ' mov es:[bp+4],al add bx,4 add bp,16 loop s1 mov bx,168 mov bp,10 mov cx,21 s2:mov ax,ds:[bx] mov es:[bp],ax mov al,' ' mov es:[bp+2],ax add bx,2 add bp,16 loop s2 mov bx,84 mov si,168 mov bp,13 mov cx,21 s3:mov ax,ds:[bx] mov dx,ds:[bx+2] div word ptr ds:[si] mov es:[bp],ax mov al,' ' mov es:[bp+2],al add si,2 add bx,4 add bp,16 loop s3 mov ax,4c00h int 21h code ends end start
运行结果如下
修改后,只剩下一个循环,代码复制性减少了很多
assume cs:code,ss:stack 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 stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,data mov ds,ax mov ax,table mov es,ax mov ax,stack mov ss,ax mov sp,10h mov bx,0 mov bp,0 mov si,0 mov cx,21 s:mov ax,ds:[bx] mov es:[bp],ax mov ax,ds:[bx+2] mov es:[bp+2],ax mov al,' ' mov es:[bp+4],al mov ax,ds:[bx+84] mov dx,ds:[bx+84+2] mov es:[bp+5],ax mov es:[bp+7],dx mov al,' ' mov es:[bp+9],al mov ax,ds:[si+168] mov es:[bp+10],ax mov al,' ' mov es:[bp+12],ax mov ax,ds:[bx+84] mov dx,ds:[bx+84+2] div word ptr ds:[si+168] mov es:[bp+13],ax mov al,' ' mov es:[bp+15],al add bp,16 //->用来表示table表内的内存偏移地址(用来控制table表的行数,以及间接地表示内存偏移地址) add bx,4 //->用来表示dd性与字符串型数据的偏移地址(每读取一段数据后,需移动四个字节) add si,2 //->>用来表示dw性数据的偏移地址(每读取一段数据后,只需移动两个字节) loop s mov ax,4c00h int 21h code ends end start
运行结果如下: