wlmtle 发表于 2011-7-18 20:26:24

汇编语言 课程设计一实在不会改了啊!!~~~~~

换了好几种方法了,就是写不对,也不知道哪里出问题了。
哪位哥哥姐姐帮忙看下,小弟先谢过了。
assume cs:code,ds:data,ss:stack
   data segment
    db '1975','1976','1977','1978','1979','1980','1981'
    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
    dd 140417,197514,345980,590827,803530,1183000,1843000
    dd 2759000,3753000,4649000,5937000 ;收入
   
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037
    dw 5635,8226,11542,14430,15257,17800 ;人数
         
    data ends

      stack segment
      db 500 dup (0)
      stack ends
    table segment
    db 500 dup (0)
    table ends
      code segment
    start:
      mov ax,data
      mov ds,ax
      mov ax,stack
      mov ss,ax                     
      mov ax,table
      mov es,ax
      
      mov sp,16
      mov bx,0
      mov di,0   
      mov si,0
;---------------------------------------------------------------------
;复制数据
   mov cx,21            ;循环次数      
   first:         
;显示年份
   mov ax,ds:      
   mov es:,ax
   mov ax,ds:      
   mov es:,ax

    mov al, 32
    mov es:, al      
;显示收入                        
    mov ax,ds:      
    mov es:,ax
    mov ax,ds:      
    mov es:,ax

    mov al, 32
    mov es:, al   
;显示人数   
    mov ax,ds:
    mov es:,ax

    mov al, 32
    mov es:, al
;显示人均收入   
    mov ax,ds:   
    mov dx,ds:
    push cx
    mov cx,ds:
    div word ptr cx
    pop cx
    mov es:,ax

    mov al, 32
    mov es:, al
   
    mov bx,4
    mov di,16
    mov si,2
    loop first
;---------------------------------------------------------------------
show:mov si, 0
   mov di, 0
   mov bx, 0
   mov cx, 21
s:mov dh,5               ;行
mov cl,10                  ;颜色
push cx
mov si,0
mov ax,es:
mov ds:,ax
mov ax,es:
mov ds:,ax
mov ax,0
mov ds:,ax
mov dl,10                   ;列
call show_str
;收入
mov ax,es:
mov dx,es:
mov si,0
call dwtoc
mov dl,18
call show_str
;人数
mov ax,es:
mov si,0
call dtoc
mov dl,26
call show_str
;人均收入
mov ax,es:
mov si,0
call dtoc
mov dl,34
call show_str

add di,16
pop cx
inc dh
loop s

      mov ax,4c00h
      int 21h
;---------------------------------------------------------------------
;将dword转为十进制字符串
      dtoc:mov cx,0
         push cx
      s1:mov dx,0
         mov cx,10d      ;除数
         div cx               
         mov cx,dx         ;dx余数
         add cx,30h      ;余数累加
         push cx         ;入栈
         inc bx            ;统计次数
         mov cx,ax         ;低位商作为循环次数
         jcxz s2         ;当为零时跳出循环
         jmp short s1
      s2:mov cx,dx         ;检测高位商
         jcxz s3
         jmp short s1
      s3:mov cx,bx         ;统计的循环次数赋给循环变量
      s4:pop ax            ;入栈数据出栈
         mov ds:,al    ;结果存至ds段
         inc si
         loop s4
         mov al,0
         mov ds:,al    ;设置结尾符零
       ok2:pop cx               
         ret   
;---------------------------------------------------------------------
;将dword转为十进制字符串      
   dwtoc:mov cx,0
             push cx         
      sx1:
         mov cx,10d      ;除数
         call divdw      ;商低位在ax中,高位在dx,'余数'在cx中
         mov dx,0
         add cx,30h      ;余数累加
         push cx         ;入栈
         inc bx            ;'统计次数'
         mov cx,ax         ;低位商作为循环次数
         jcxz sx2         ;当为零时跳出循环
         jmp short sx1
      sx2:mov cx,dx         ;检测高位商
         jcxz sx3
         jmp short sx1
      sx3:mov cx,bx         ;统计的循环次数赋给循环变量
      sx4:pop ax            ;入栈数据出栈
         mov ds:,al    ;结果存至ds段
         inc si
         loop sx4
         mov al,0
         mov ds:,al    ;设置结尾符零
       ok22:pop cx               
         ret         
;---------------------------------------------------------------------
;进行不会产生溢出的除法运算      
      divdw:push ax   
            mov ax,dx    ;高位赋给低位
            mov dx,0
            div cx       ;除完后ax存高位商,dx存余数
            mov bx,ax    ;高位商赋给bx保存
            pop ax       ;低位出栈
            div cx       ;低位+高位除后的余数
            mov cx,dx    ;把第二次除法的'余数'保存到cx
            mov dx,bx    ;把第一次除法的高位商保存到dx,低位商即存在ax中            
      ret      
;---------------------------------------------------------------------
;在指定的位置 用指定的颜色 显示一个用0结束的字符串
show_str:push es
         push ax
         push bx
         push cx
         push di
         mov ax,0b800h
         mov es,ax                  ;显示段
         
         dec dh
         mov al,0a0h                ;被乘数         
         mul dh                     ;行 结果存在ax中

         mov dh,0
         add dl,dl               ;列
         add ax,dx               ;ax=ax(行)+dx(dh=0,dl=列)
         mov di,ax               ;偏移地址指向显存
   
         mov ah,cl               ;颜色                     
   sshow:mov cl,ds:            ;数据
         mov ch,0                  ;清空cx高位
         jcxz ok1
         mov al,cl         
         mov es:,al          ;传至显存显示
         mov es:,ah          ;字符属性
         inc si
         add di,2
         jmp short sshow         
   ok1:pop di
         pop cx
         pop bx
         pop ax
         pop es
         ret
code ends
end start


页: [1]
查看完整版本: 汇编语言 课程设计一实在不会改了啊!!~~~~~