实验七

作者: 退堂鼓国家一级艺术家 | 来源:发表于2017-07-10 22:04 被阅读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  
    

    相关文章

      网友评论

        本文标题:实验七

        本文链接:https://www.haomeiwen.com/subject/ecpuhxtx.html