汇编语言答案与笔记

实验七

2017-07-10  本文已影响7人  退堂鼓国家一级艺术家

思路

首先你要摆出两个数据块从头到尾的读写对应的内存地址

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

结论

  1. 首先我们确定一定需要用循环,因为纯手写太麻烦了,而且显而易见,这个读写的内存地址是有规律的。
  2. 那么我们来确定有那些是要写做循环中的“变量”,那些是固定的。
  3. 在data里的0054h、4h和2h是变量,决定data内数据的内存地址偏移。剩下的0和2就是固定的,表示一个数据内部的相对位置了。
  4. 在table里显然是10h是变量
  5. 然后我们来确定哪些变量是累积变量,也就是说在循环后不会重新赋值的,而是随着循环累积的。显然0054h决定的是数据从年份到年收入到雇员,这个循环每一次都应该从年份开始,所以是每一次循环都要重置的。而在每一类数据的内部的位置是会随着循环不断增加的,比如一开始都是读取每一类数据的第一个数据,循环一次后读取第二个数据,这个就不需要重置。
  6. 那么累积变量有4h和2h以及10h
  7. 至于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  
上一篇下一篇

猜你喜欢

热点阅读