qw58460 发表于 2015-10-29 22:32:13

关于课程设计1的问题求大神来解答下

assume cs:code

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' ;以上是表示21年的21个字符串。0~53h

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司总收入的21个dword型数据54h~a7h

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800 ;以上是表示21年公司雇员人数的21个word型数据。a8~d1h
data ends



table segment
db 8 dup(0)
table ends

code segment
   start:mov ax,0b800h
         mov es,ax
               mov di,0
               mov cx,80*24
           a:mov byte ptr es:,' '
             mov byte ptr es:1,0
             add di,2
               loop a
         mov ax,table
         mov ds,ax
               mov ax,data
               mov es,ax
               mov si,0   ;ds:si指向字符串
               
               mov bx,0    ;bx控制年份和总收入
               
               mov di,0   ;di控制雇员数和平均收入
               
               mov dh,4       ;dh控制行数
               mov cx,21      ;循环次数
      
      s:push cx          ;保护CX
          mov ax,es:      ;BX控制年份和总收入
                mov ,ax          ;年份字符串传送和显示
                mov ax,es:2
                mov 2,ax
                mov byte ptr 4,0 ;防止下面的字符串占到这里
      mov cl,2
                mov dl,0
                call show_str
               
               
               
                mov ax,es:54h
                push dx   ;保护dx的行数接下来的高16为要用到dx
                mov dx,es:56h;总收入数据变成字符串和传送
                call dtoc_dword
                pop dx
                mov cl,2
                mov dl,20
                call show_str
               
               
               
                mov ax,es:0a8h ;雇员数数据变成字符串和传送
                call dtoc_word
                mov cl,2
                mov dl,40
                call show_str
               
               
                mov ax,es:54h
      push dx
      mov dx,es:56h
      div word ptr es:0a8h;计算人均收入并显示
      call dtoc_word
      pop dx
      mov cl,2
      mov dl,60               
                call show_str
               
                add bx,4
                add di,2
                add dh,1
                pop cx
                loop s
               
                mov ax,4c00h
                int 21h
               
               
               
;名称:show_str
;功能:在屏幕的指定位置,用指定颜色,显示一个用0结尾的字符串
;参数:(dh)=行号,(dl)=列号(取值范围0~80),(cl)=颜色,ds:si该字符串的首地址
;返回:显示在显示屏幕上               
show_str:
    push ax
        push bx
        push cx
        push dx
        push di
    push si
        push es
   
        mov ax,0b800h
        mov es,ax
        mov ax,160   
        mul dh   ;计算显示地址
        add dl,dl
        mov dh,0
        add ax,dx
        mov bx,ax
        mov ah,cl   ;颜色准备
d:mov cl,
    mov ch,0
        jcxz ok
        mov al,cl
        mov es:,ax ;字符串和颜色一起传送
        inc si
        add bx,2
        jmp short d
       
ok:pop es
    pop si
    pop di
    pop dx
    pop cx
    pop bx
    pop ax
    ret

;名称:dtoc_dword
;功能:将一个double word型数转化为字符串
;参数:(dx)=数的高八位,(ax)=数的低八位
;返回:ds:放此字符串,以0结尾
;备注:会用到divdw函数
dtoc_dword:        
    push ax
    push bx
    push cx
    push dx
    push di
    push si       
       
        mov bx,0 ;BX计算字符串的长度
       
f:mov cx,10
    call divdw
    push cx
        inc bx
        cmp ax,0
    jne f
    cmp dx,0
    jne f

   mov cx,bx   ;将栈里面的字符串送入ds:si处
   h:pop
        add byte ptr ,30h
        inc si
        loop h
    pop si
    pop di
        pop dx
        pop cx
        pop bx
        pop ax
        ret

;名称:dtoc_word
;功能:将一个word数据转化为字符串
;参数:(ax)=word型数据,ds:si指向字符串的首地址       
;返回:ds:si放此字符串,以0结尾       
dtoc_word:
   push ax
   push bx
   push cx
   push dx
   push si
   push di

   mov bx,0;BX计算字符串的长度
g:mov dx,0
   mov cx,10
   div cx
   mov cx,ax;将商给cx看是不是为0是0就跳
   add dx,30h
   push dx          ;保存商位0余数为N (N)余数为最后一次
   inc bx
   jcxz ok2   
   jmp short g
ok2:mov cx,bx
s2:pop
    inc si       
        loop s2
   pop di
   pop si
   pop dx
   pop cx
   pop bx
   pop ax
   ret
       
;名称:divdw
;功能:除法 被除数32位,除数16位,商32位,余数16位,不会溢出
;参数(dx)=被除数的高16位,(ax)=被除数低16位,(cx)=除数
;返回:(dx)=商高16位,(ax)=商低16位,(cx)=余数
divdw:
push bx
push ax

mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret

       
code ends
end start               
                  

qw58460 发表于 2015-10-29 22:38:01

问题是 cmp我是从网上复制过来的我也还没学到cmp和jne指令我就想说下为什么我用这样的子程序会出错dtoc_dword:        
    push ax
    push bx
    push cx
    push dx
    push di
    push si       
       
        mov bx,0 ;BX计算字符串的长度
       
f:mov cx,10
    call divdw
        jcxz ok
    push cx
        inc bx
   

ok:mov cx,bx   ;将栈里面的字符串送入ds:si处
   h:pop
        add byte ptr ,30h
        inc si
        loop h
    pop si
    pop di
        pop dx
        pop cx
        pop bx
        pop ax
        ret
这个子程序单独运行没问题但替换上面的子程序就会出错求大神解答。

qw58460 发表于 2015-10-29 22:40:44

qw58460 发表于 2015-10-29 22:38
问题是 cmp我是从网上复制过来的我也还没学到cmp和jne指令我就想说下为什么我用这样的子程序会出错dtoc_dwo ...

inc bx 忘写jmp short f

dps521 发表于 2015-10-29 23:24:56

kanyixia我也不懂
页: [1]
查看完整版本: 关于课程设计1的问题求大神来解答下