assume cs:codesg, ds:datasg, ss:stacksg, es:tablesg ;告诉编译器是这样 但是cpu不知道
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995' ;以上是表示21年的21个字符串
;上面的数据地址范围是0到53H
dd 16,22,382,1356,2390,16000,24486,50065,97479,140417,197514,345980,590827,803550,1843000,2759000,3753000,4649000,5937000
;上面的数据地址范围是54H到A7H
dw 3,7,9,13,28,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800
;上面的数据地址范围是A8H到D1H
datasg ends
tablesg segment
db 21 dup('year summ ne ?? ') ;这里只是占位 year是四个字节 summ是4个字节 ne两个字节 ??两个字节
tablesg ends
codesg segment
start: mov ax,datasg
mov ds,ax ;绑定数据段地址
mov ax,tablesg
mov es,ax ;绑定表格段地址
mov ax,stacksg
mov ss,ax ;绑定栈的段地址
mov sp,16 ;设置栈顶指针
mov cx,21 ;编译器中可以用十进制表示一个数字 dosbox中只能用16进制表示
mov si,0 ;si每次都需要重置为0
mov di,0 ;di不需要重置为0
mov bx,0
s0:
push cx
mov cx,4 ;内部循环4次
s1:
mov al,ds:[di]
mov es:[si+bx],al ;一次一个字节且一次mov指令不能够从一个内存单元移动到另一个内存单元,所以需要用al寄存器过渡
inc di
inc si
loop s1
add bx,16
mov si,0
pop cx ;弹出cx
loop s0
mov ax,4c00H
int 21H
codesg ends
end start