lsh2323192152 发表于 2019-7-3 20:39:46

课程设计1写得有点抓狂

assume cs:code,ds:data,ss:stack
stack segment
        dw 8 dup (0)
        stack ends
data segment
        db '1975','1976','1977','1978','1979','1980','1981';年份起始地址0
        db '1982','1983','1984','1985','1986','1987','1988'
        db '1989','1990','1991','1992','1993','1994','1995'
             
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479;收入起始地址84
        dd 140417,197514,345980,590827,803530,1183000
        dd 1843000,2759000,3753000,4649000,5937000
       
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258      ;人数起始地址168
        dw 2793,4037,5635,8226,11542,14430,15257,17800
       
        dw 21 dup (0)   ;人均收入起始地址210
       
        db 8 dup (0)    ;空储存段起始地址252
        data ends
code segment
start:      mov ax,data      ;将DS指向DATA段
            mov ds,ax
            mov bx,84          ;BX指向收入起始地址
            mov si,168          ;SI指向人数起始地址
            mov di,210          ;DI指向人均收入起始地址
            
            mov ax,stack      ;将SS指向STACK段
            mov ss,ax         
            mov sp,16         ;将SS段设为空栈
            
            mov cx,21         ;求21年的人均收入循环

             s:   push cx            
            mov ax,
            mov dx,
            mov cx,
            div cx
            mov ,ax
            add bx,4
            add si,2
            add di,2
            pop cx
            loop s
            
            
            mov bp,640         ;将ES指向显存区,BP起始为640
            mov ax,0b800h
            mov es,ax
            mov cx,21          ;21次循环将21年的的数据放入显存区
            mov bx,0         ;BX指向年份起始
            mov di,168         ;DI指向人数起始
            mov si,0         ;SI设为偏移量
            
    s2:   call show          ;进入SHOW函数
            
            mov ax,4c00h
            int 21h
            
   show:    push cx            ;将循环次数入栈
            push bp            ;将BP入栈
            
               mov cx,4               
      s0: mov al,      ; 四次循环把年份放入显存区
            mov es:,al
            inc si
            add bp,2
            loop s0
            
            mov ax,      ;把收入高16位低16位分别放入AX,DX中
            mov dx,
            mov si,0            ;SI置0
            call divdw            ;进入DIVDW求收入的每一位的ASCII码
            
            mov ax,         ;人数放入AX
            mov dx,0               ;DX置0
            mov si,0            
            call divdw            ;求人数的每一位的ASCII码
            
            mov ax,      ;人均收入放入AX
            mov dx,0            ;DX置0
            mov si,0
            call divdw            ;求人数的每一位的ASCII码
            pop bp                ;BP指向下一行
            add bp,160            
            add bx,4            ;BX指向下一年
            add di,2            ;DI指向下一人数
            pop cx                ;取出循环次数判断
            loop s2               

            divdw:mov cx,10000   
            div cx            ;求出商为万位数后的数值,余数为千百十个位数
            push ax         ;将万位数后的数入栈
            mov ax,dx      ;千百十个位数放入AX
            mov dx,0         ;DX置0
            mov cx,4         ;CX为循环次数
            call div1      
            
            pop ax         ;取出万位后的数
            mov dx,0         ;DX置0
            mov cx,4         ;循环次数
            call div1
      
       s3:dec si          ;SI指向最后的ASCII码
            add bp,10       ;BP指向下一存放区
            jmp short show1
            
    div1:   push cx      ;循环次数入栈
            mov cx,10      ;除数10
            div cx         ;求出商和余数
            mov ,dl ;把余数放入空数据段
            inc si         ;SI+252指向下一空数据
            mov dx,0       ;DX置0
            pop cx         ;取循环次数进行判断
            loop div1
            
            ret            
            
             show1:   mov al,;把每一位数的ASCII码值放入显存区
            add al,30h
            mov es:,al
            mov cx,si         ;判断SI是否为零
            jcxz ok
            dec si            ;SI+252指向上一数据
            add bp,2          ;显存区单元加2
            jmp short show1
            
      ok: ret
         
            
            code ends
            end start
页: [1]
查看完整版本: 课程设计1写得有点抓狂