思路
首先你要摆出两个数据块从头到尾的读写对应的内存地址
data | table | 说明 |
---|---|---|
0 | 0 | 写年份的第一个‘1975’的第一个字符‘19’,这里都是第一个字符 |
2 | 2 | 写‘1975’的‘75’,第二个字符 |
0054h+0h | 5h | 写年收入的第一个16,虽然table数过去是第5h个字符,但是data已经要跳到年收入的地方,也就是往后移21*4=84,换做16进制就是54h。那么相应地内存地址就应该加上0054h |
0054h+2h | 7h | 同上 |
0108h+0h | 0ah*** | 这里是从年收入要跳到雇员人数,依旧要加0054h |
4h+0h | 10h+0h | 写年份的第二个‘1976’,因为往后移了一个年份,内存地址要加4h |
4h+2h | 10h+2h | 写‘76’,同上 |
0054h+4h+0h | 10h+5h | 写年收入的第二个,22 |
0054h+4h+2h | 10h+7h | 写年收入的第二个,22,分开两次写是因为年收入定义的是一个双字型数据,有4个字节,寄存器一次可以处理两个字节,所以需要2次 |
0108h+2h+0h | 10h+0ah*** | 写雇员的第二个数据——7,因为7是一个字符型数字,只有2个字节,所以这里的偏移不是4,是2 |
……
注意在源程序里不允许数据是以字母开头的,如果有就在前面加0
结论
- 首先我们确定一定需要用循环,因为纯手写太麻烦了,而且显而易见,这个读写的内存地址是有规律的。
- 那么我们来确定有那些是要写做循环中的“变量”,那些是固定的。
- 在data里的0054h、4h和2h是变量,决定data内数据的内存地址偏移。剩下的0和2就是固定的,表示一个数据内部的相对位置了。
- 在table里显然是10h是变量
- 然后我们来确定哪些变量是累积变量,也就是说在循环后不会重新赋值的,而是随着循环累积的。显然0054h决定的是数据从年份到年收入到雇员,这个循环每一次都应该从年份开始,所以是每一次循环都要重置的。而在每一类数据的内部的位置是会随着循环不断增加的,比如一开始都是读取每一类数据的第一个数据,循环一次后读取第二个数据,这个就不需要重置。
- 那么累积变量有4h和2h以及10h
- 至于0054h则需要每一次循环的开始重置为0
于是,规定好这些变量放在哪个偏移地址寄存器里。(bx、bp,si,di***)
注意bx不能和bp一起用,si也不能和di一起用)
代码
assume cs:code,ds:data,es:table
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
code segment
start:
mov ax,table
mov ds,ax
mov ax,data
mov es,ax
mov cx,21
mov bx,0
mov di,0
mov si,0
s0: mov bp,0
mov ax,es:[bp+di]
mov [bx],ax
mov ax,es:[bp+di+2]
mov [bx+2],ax
add bp,54h
mov ax,es:[bp+di]
mov [bx+5],ax
mov ax,es:[bp+di+2]
mov [bx+7],ax
add bp,54h
mov ax,es:[bp+si]
mov [bx+0ah],ax
add bx,10h
add di,4h
add si,2h
loop s0
mov ax,4c00h
int 21h
code ends
end start
网友评论