鱼C论坛

 找回密码
 立即注册
查看: 2794|回复: 17

如何21年总收入放入ds:si21次循环

[复制链接]
发表于 2012-11-14 14:13:30 | 显示全部楼层 |阅读模式
1鱼币
assume cs:codesg,ds:datasg,es:table,ss:stack
table segment
  db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  db '1984','1985','1986','1987','1988','1989','1990','1991','1991'
  db '1993','1994','1995'
  ;以上是表示21年的21个字符串
  
  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000
  ;以上是表示21年公司总收入的21个dword型数据
  
  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型数据
  
  dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
  dw 260,304,333
  ;以上是表示21年公司人均收入
  
  
table ends
datasg segment
  
  db 1000 dup (0)
  
datasg ends
stack segment
  db 100 dup (0)

stack ends
codesg segment
  start:
         
            mov ax,datasg
   mov ds,ax
   
      mov ax,table
   mov es,ax
   mov si,0
   mov bp,0
   
   mov ax,stack
   mov ss,ax
   mov sp,100
   
   mov cx,21
s7:  call dtoc
   add bp,16               ;bp加16换行
      add si,4                ;si+4
   loop s7
   
            mov ax,4c00h
            int 21h   

  
dtoc: push dx
       push cx
    push si
    push bx
    push ax ;cx、si入栈

s4:      
       mov ax,es:[si+54h]
       mov dx,es:[si+56h]
         

    mov bx,0
   
s1:  mov cx,10d
         push ax       ;ax值入栈
   
   mov ax,dx     ;dx值等于ax
   
   mov dx,0      ;dx为零
   
   div cx        ;除以cx
  
   mov cx,ax     ;商为零cx
   
   jcxz s2       ;cx为零转移到s2
   
   add dx,30h
   push dx
   
   inc bx
   
   jmp short s1
    s5:  pop ax
         mov cx,ax
   jcxz okay

  s6:  mov dx,0
   mov cx,10
     
   div cx
  
    mov cx,ax
   
    jcxz s2
   
    add dx,30h
    push dx
   
    inc bx
   
    jmp short s6
   
    s2:   add dx,30h          ;余数加30h放入dx
       push dx             ;dx入栈
    inc bx              ;bx记寻加1
   
    mov cx,bx           ;bx放入cx判断
   
   
    mov di,0            ;di等于0
s3:   pop ax              ;dx植出栈放入ax
         
    mov ds:[bp+di+05h],al   ;[bp+di+05h]=al
    add di,1               ;di加1
              
     loop s3                 ;loop 循环
         
    jmp short s5

okay: pop ax
          pop bx
          pop si
         pop cx
         pop dx
     
   
    ret
codesg ends
end start



入栈出栈放晕了, 帮我改改吧。  

最佳答案

查看完整内容

http://bbs.fishc.com/thread-21561-1-1.html 看我的这个.课程设计1,详细注释 呵呵,来抢分了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-14 14:13:31 | 显示全部楼层
本帖最后由 pediyzhi 于 2012-11-14 22:10 编辑

http://bbs.fishc.com/thread-21561-1-1.html
看我的这个.课程设计1,详细注释
呵呵,来抢分了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-14 14:14:51 | 显示全部楼层
这是课程设计1的题目, 有答案可以告诉下在哪啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-14 18:19:41 | 显示全部楼层
assume cs:code ,ds:data ,ss:stack

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'
;============================================================================
d2 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
   dd 456980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;============================================================================
d3 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
   dw 11542,14430,15257,17800
;============================================================================
d4 dw 20 dup (0)
data ends
;============================================================================
stack segment
dw 20 dup (0)
stack ends
;============================================================================
;============================================================================
code segment
;============================================================================

strat:      mov ax,data
            mov ds,ax
            mov ax,0b800h
            mov es,ax
            mov ax,stack
            mov ss,ax
            mov sp,20
            ;-----------------初始化寄存器
            mov bx,160
            mov si,0
            mov di,0
            ;-----------------DI指向显存
            mov bp,offset d2
            ;-----------------BP指向D2
            mov cx,21
;=============================================================================            
                        ;显示日期
zhuxh:      call riqi
            
            
;=============================================================================
                        ;显示收入
                        
            push di
            xor di,di
            add di,30
            call shouru
            pop di
            ;----------------------写人数间距加20
;=============================================================================
                        ;显示人数
            push di
            xor di,di
            add di,60
            call renshu
            pop di
            ;----------------------与平均娄间距加20

;=============================================================================
                        ;显示平均
            push di
            xor di,di
            add di,90            
            call pingjun                                                      
            call dtoc
            ;----------------------结果转ASCII码
            call show_str
            pop di
            ;----------------------显示
;=============================================================================
            add bx,160
            mov di,0
            add si,2
            add bp,4
            loop zhuxh
                     
            mov ah,01
            int 21h
            
            
            
;=========                ====================================================
;==============================================================================
;==========================显示show_str========================================
show_str:   
            push bp
            push cx
            mov bp,offset d4
xssj:       mov cl,ds:[bp]
            mov ch,0
            inc bp
            jcxz xswk
            mov es:[bx+di],cl
            inc di
            mov es:[bx+di],2
            inc di
            jmp xssj
xswk:       pop cx
            pop bp
            
            ret
;==============================================================================
;==========================转换DTOC============================================
dtoc:       push si
            push di
            push bp
            push cx
            push bx
            mov bx,10
            mov si,0
            ;-----------保存数据
d_hys:      mov bp,ax
            ;-----------转移L位
            mov ax,dx
            xor dx,dx
            ;-----------H转AX D清零
            div bx
            ;-----------H/10
            mov di,ax
            ;-----------H结果=DI
            mov ax,bp
            ;-----------L重赋给AX
            div bx
            ;-----------REG+L/10  DX=余娄  H结果=DI
            ;===========          L结果AX
            
            mov cx,bp
            jcxz d_wk            
            ;-----------余数为空jmp 到出栈
            add dx,30h
            push dx
            inc si
            xor dx,dx
            ;------------余数+30H=ASCII
            mov dx,di
            ;------------H重赋给DX
            jmp d_hys
            ;------------判断H为0,不为0循环
            ;============          为0做L位除法
d_wk:       mov cx,si
            ;------------设定循环数
            jcxz d_ecs
            ;------------CX为0 jmpECS
            mov si,offset d4
            ;------------d4数据给SI        
d_cz:       pop ds:[si]
            inc si
            loop d_cz              
            ;-------------循环出栈

d_ecs:      pop bx
            pop cx
d_2:        pop bp
            pop di        
            pop si
            ret
;===============================================================================
;==========================除法divdd==========================================
divdd:      push si
            push bp
            push bx
            push cx
            ;-------------保存数据
            mov bp,ax
            ;-------------L转BP
            mov ax,dx
            mov dx,0
            ;-------------H给AX
            div bx
            ;-------------H/10
            mov si,ax
            ;-------------H结果给SI
            mov ax,bp
            ;-------------L重赋给AX
            div bx
            mov dx,si
            ;-------------H赋值给DX                        
            pop cx
            pop bx
            pop bp
            pop si  
            ret         
;==============================================================================
;==========================日期riqi============================================
riqi:       push si
            ;------------------保存数据
            ;push
            add si,si
            mov ax,ds:[si]
            mov ds:0d2h,ax
            mov ax,ds:2[si]
            mov ds:0d4h,ax
            mov ds:0d6h,0
            call show_str                                                               
            pop si
            ret  
;==============================================================================
;==========================收入shouru==========================================
shouru:     push si
            push bp
            ;------------------保存数据
            mov si,offset d4
            ;------------------d4=si
            mov ax,ds:[bp]
            mov dx,ds:2[bp]
            ;-------------------AX&DX赋值
            call dtoc
            call show_str
            ;-------------------转换ASCII&显示
            
            pop bp
            pop si
            ret  
;==============================================================================
;==========================人数renshu==========================================
renshu:     push si
            ;------------------保存数据
            ;mov dx,offset d3
            mov ax,ds:0a8h[si]   
            mov dx,0
            call dtoc
            call show_str
            pop si                     
;===============================================================================
;==========================平均pingjun==========================================
pingjun:    push si
            push bx
            push di
            push bp
            ;-------------------;保存数据
            mov ax,ds:[bp]
            mov dx,ds:2[bp]
            ;-------------------DX&AX赋值 被除数
            mov bx,ds:0A8H[si]
            ;-------------------BX赋值    除数
            call divdd
            
            
            pop bp
            pop di
            pop bx
            pop si
            ret
                                                           
code ends
end strat
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-14 18:20:24 | 显示全部楼层
每个人思路不同,这是俺自己的~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-14 19:03:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-14 19:05:29 | 显示全部楼层
第二份答案,一样编辑出错??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-14 19:06:09 | 显示全部楼层
assume cs:code,ds:data,es:table

table 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,2795000,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

    dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239

    dw 260,304,333

table ends

data segment

    db 32 dup (0)

data ends

code segment

start:   mov ax,data

     mov ds,ax

     mov ax,table

     mov es,ax

     mov bx,0

     mov si,0

     mov di,0

     mov cx,21

     mov dh,2

     mov dl,30

g:   push cx

     push dx

     mov ax,es:[bx]

     mov [si],ax

     mov ax,es:[bx].2

     mov [si].2,ax ;年份入ds:si

     add si,6 

     mov ax,es:[bx].84

     mov dx,es:[bx].86

     call dtoc2    ;收入转成十进制字符入ds:si

     add si,10

     mov ax,es:[di].168

     mov dx,0

     call dtoc2    ;人员数转成十进制字符入ds:si

     add si,6

     mov ax,es:[di].210

     mov dx,0

     call dtoc2    ;人均收入转成十进制字符入ds:si

     mov si,0      ;设置ds:si指向需显示字符首地址

b:   mov cx,29

c:   push cx

     mov cl,[si]

     jcxz f        ;(ds:si)=0转到f执行

d:   inc si

     pop cx

     loop c

     inc si

     mov al,0

     mov [si],al   ;设置结尾符0

     mov si,0      ;设置ds:si指向需显示字符首地址

     pop dx

     mov cl,2

     call show_str

     add bx,4      ;dword数据指向下一数据单元

     add di,2      ;word数据指向下一数据单元

     add dh,1      ;指向显存下一行

     pop cx

     loop g

     mov ax,4c00h

     int 21h

f:   mov al,20h

     mov [si],al   ;(ds:si)=0的数据改成空格

     jmp d

 

;名称:dtoc2

;功能:将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。

;参数:(ax)=dword型数据的低16位;

;      (dx)=dword型数据的高16位;

;      ds:si指向字符串首地址。

;返回:无。

dtoc2:

     push ax

     push bx

     push cx

     push dx

     push si

     push di

     mov di,0

d20: mov cx,10     ;除数为10

     call divdw

     add cx,30h    ;余数+30h,转为字符

     push cx       ;字符入栈

     inc di        ;记录字符个数

     mov cx,ax 

     jcxz d21      ;低位商=0时,转到d21检测高位商

     jmp d20

d21: mov cx,dx

     jcxz d22      ;高低位商全=0时,转到d22执行

     jmp d20

d22: mov cx,di

d23: pop ax        ;字符出栈

     mov [si],al

     inc si        ;ds:si指向下一单元

     loop d23

     mov al,0

     mov [si],al   ;设置结尾符0

     pop di

     pop si

     pop dx

     pop cx

     pop bx

     pop ax

     ret

 

;名称:divdw

;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。

;参数:(ax)=dword型数据的低16位;

;      (dx)=dword型数据的高16位;

;      (cx)=除数。

;返回:(dx)=结果的高16位;

;      (ax)=结果的低16位;

;      (cx)=余数。

divdw:

     push si

     push bx

     push ax

     mov ax,dx

     mov dx,0

     div cx        ;被除数的高位/cx

     mov si,ax

     pop ax 

     div cx        ;(被除数高位的商+低位)/cx

     mov cx,dx     ;余数入cx

     mov dx,si     ;高位的商入dx

     pop bx

     pop si

     ret

 

;名称:show_str

;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。

;参数:(dh)=行号(取值范围0~24);

;      (dl)=列号(取值范围0~79);

;      (cl)=颜色;

;      ds:si指向字符串的首地址。

;返回:无。

show_str:

     push ax

     push bx

     push es

     push si

     mov ax,0b800h

     mov es,ax

     mov ax,160

     mul dh

     mov bx,ax     ;bx=160*dh

     mov ax,2

     mul dl        ;ax=dl*2

     add bx,ax     ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址

     mov al,cl     ;把颜色cl赋值al

     mov cl,0

show0:

     mov ch,[si]

     jcxz show1    ;(ds:si)=0时,转到show1执行    

     mov es:[bx],ch

     mov es:[bx].1,al

     inc si        ;ds:si指向下一个字符地址

     add bx,2      ;es:bx指向下一个显存地址

     jmp show0

show1:

     pop si

     pop es

     pop bx

     pop ax

     ret

 

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-14 19:07:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-14 20:14:27 | 显示全部楼层

assume cs:code ,ds:data ,ss:stack

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'
;============================================================================
d2 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
   dd 456980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;============================================================================
d3 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
   dw 11542,14430,15257,17800
;============================================================================
d4 dw 20 dup (0)
data ends
;============================================================================
stack segment
dw 20 dup (0)
stack ends
;============================================================================
;============================================================================
code segment
;============================================================================

strat:      mov ax,data
            mov ds,ax
            mov ax,0b800h
            mov es,ax
            mov ax,stack
            mov ss,ax
            mov sp,20
            ;-----------------初始化寄存器
            mov bx,160
            mov si,0
            mov di,0
            ;-----------------DI指向显存
            mov bp,offset d2
            ;-----------------BP指向D2
            mov cx,21
;=============================================================================            
                        ;显示日期
zhuxh:      call riqi
            
            
;=============================================================================
                        ;显示收入
                        
            push di
            xor di,di
            add di,30
            call shouru
            pop di
            ;----------------------写人数间距加20
;=============================================================================
                        ;显示人数
            push di
            xor di,di
            add di,60
            call renshu
            pop di
            ;----------------------与平均娄间距加20

;=============================================================================
                        ;显示平均
            push di
            xor di,di
            add di,90            
            call pingjun                                                      
            call dtoc
            ;----------------------结果转ASCII码
            call show_str
            pop di
            ;----------------------显示
;=============================================================================
            add bx,160
            mov di,0
            add si,2
            add bp,4
            loop zhuxh
                     
            mov ah,01
            int 21h
            
            
            
;=========                ====================================================
;==============================================================================
;==========================显示show_str========================================
show_str:   
            push bp
            push cx
            mov bp,offset d4
xssj:       mov cl,ds:[bp]
            mov ch,0
            inc bp
            jcxz xswk
            mov es:[bx+di],cl
            inc di
            mov word ptr es:[bx+di],2
            inc di
            jmp xssj
xswk:       pop cx
            pop bp
            
            ret
;==============================================================================
;==========================转换DTOC============================================
dtoc:       push si
            push di
            push bp
            push cx
            push bx
            mov bx,10
            mov si,0
            ;-----------保存数据
d_hys:      mov bp,ax
            ;-----------转移L位
            mov ax,dx
            xor dx,dx
            ;-----------H转AX D清零
            div bx
            ;-----------H/10
            mov di,ax
            ;-----------H结果=DI
            mov ax,bp
            ;-----------L重赋给AX
            div bx
            ;-----------REG+L/10  DX=余娄  H结果=DI
            ;===========          L结果AX
            
            mov cx,bp
            jcxz d_wk            
            ;-----------余数为空jmp 到出栈
            add dx,30h
            push dx
            inc si
            xor dx,dx
            ;------------余数+30H=ASCII
            mov dx,di
            ;------------H重赋给DX
            jmp d_hys
            ;------------判断H为0,不为0循环
            ;============          为0做L位除法
d_wk:       mov cx,si
            ;------------设定循环数
            jcxz d_ecs
            ;------------CX为0 jmpECS
            mov si,offset d4
            ;------------d4数据给SI        
d_cz:       pop ds:[si]
            inc si
            loop d_cz              
            ;-------------循环出栈

d_ecs:      pop bx
            pop cx
d_2:        pop bp
            pop di        
            pop si
            ret
;===============================================================================
;==========================除法divdd==========================================
divdd:      push si
            push bp
            push bx
            push cx
            ;-------------保存数据
            mov bp,ax
            ;-------------L转BP
            mov ax,dx
            mov dx,0
            ;-------------H给AX
            div bx
            ;-------------H/10
            mov si,ax
            ;-------------H结果给SI
            mov ax,bp
            ;-------------L重赋给AX
            div bx
            mov dx,si
            ;-------------H赋值给DX                        
            pop cx
            pop bx
            pop bp
            pop si  
            ret         
;==============================================================================
;==========================日期riqi============================================
riqi:       push si
            ;------------------保存数据
            ;push
            add si,si
            mov ax,ds:[si]
            mov ds:0d2h,ax
            mov ax,ds:2[si]
            mov ds:0d4h,ax
            mov word ptr ds:0d6h,0
            call show_str                                                               
            pop si
            ret  
;==============================================================================
;==========================收入shouru==========================================
shouru:     push si
            push bp
            ;------------------保存数据
            mov si,offset d4
            ;------------------d4=si
            mov ax,ds:[bp]
            mov dx,ds:2[bp]
            ;-------------------AX&DX赋值
            call dtoc
            call show_str
            ;-------------------转换ASCII&显示
            
            pop bp
            pop si
            ret  
;==============================================================================
;==========================人数renshu==========================================
renshu:     push si
            ;------------------保存数据
            ;mov dx,offset d3
            mov ax,ds:0a8h[si]   
            mov dx,0
            call dtoc
            call show_str
            pop si                     
;===============================================================================
;==========================平均pingjun==========================================
pingjun:    push si
            push bx
            push di
            push bp
            ;-------------------;保存数据
            mov ax,ds:[bp]
            mov dx,ds:2[bp]
            ;-------------------DX&AX赋值 被除数
            mov bx,ds:0A8H[si]
            ;-------------------BX赋值    除数
            call divdd
            
            
            pop bp
            pop di
            pop bx
            pop si
            ret
                                                           
code ends
end strat
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-14 20:15:11 | 显示全部楼层
没有加word ptr 嘿嘿!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-14 21:21:31 | 显示全部楼层
显出出来了, QQ截图20121114212658767676.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-14 21:27:37 | 显示全部楼层
乄ヤ灬风 发表于 2012-11-14 21:21
显出出来了,

嗯。。。结贴吧~~~哥!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-14 23:01:28 | 显示全部楼层
assume cs:codesg,ds:datasg,es:table,ss:stack

table segment

  db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  db '1984','1985','1986','1987','1988','1989','1990','1991','1991'
  db '1993','1994','1995'
  ;以上是表示21年的21个字符串
  
  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000
  ;以上是表示21年公司总收入的21个dword型数据
  
  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型数据
  
  dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
  dw 260,304,333
  ;以上是表示21年公司人均收入
  
  
table ends

datasg segment
  
  db 1000 dup (0)
  
datasg ends

stack segment

  db 100 dup (0)
 
stack ends

codesg segment

  start:
          
            mov ax,datasg
                        mov ds,ax
                        
                    mov ax,table
                        mov es,ax
                        mov si,0
                        mov bp,0
                        
                        mov ax,stack
                        mov ss,ax
                        mov sp,100
                        
                        mov cx,21
        s7:                call dtoc
                        add bp,16               ;bp加16换行
                    add di,4                ;si+4
                        loop s7
                        
            mov ax,4c00h
            int 21h                        

                     

                
        dtoc: 
              push cx
                  push di
                  push si

                  ;cx、si入栈


        s4:                           
              mov ax,es:[di+54h]
              mov dx,es:[di+56h]
         

                  

                  mov bx,0
                  
        s1:  mov cx,10d
         push ax       ;ax值入栈
                 
                 mov ax,dx     ;dx值等于ax
                  
                 mov dx,0      ;dx为零
                 
                 div cx        ;除以cx
  
                 mov cx,ax     ;商为零cx
                  
                 jcxz s2       ;cx为零转移到s2
                  
                 add dx,30h
                 push dx
                  
                 inc bx
                  
                 jmp short s1
    s5:  mov bx,0
             pop ax
         
         mov cx,ax
         jcxz okay                 

         s6:         mov dx,0
                 mov cx,10
            
                 div cx
  
                  mov cx,ax
                  
                  jcxz s2
                  
                  add dx,30h
                  push dx
                  
                  inc bx
                  
                  jmp short s6
                  
    s2:   add dx,30h          ;余数加30h放入dx
              push dx             ;dx入栈
                  inc bx              ;bx记寻加1
                  

                  mov cx,bx           ;bx放入cx判断
                  
                  
                  mov di,0            ;di等于0
        s3:   pop ax              ;dx植出栈放入ax
          
                  mov ds:[bp+di+05h],al   ;[bp+di+05h]=al
                  add di,1                      ;di加1
                                                        
                   loop s3                 ;loop 循环
          
                  jmp short s5 



        okay: pop di
                  pop cx                          
                  
                  ret

codesg ends

end start
我改的,还是被除数还是只可以等于FFFF.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-14 23:02:58 | 显示全部楼层
乄ヤ灬风 发表于 2012-11-14 23:01
我改的,还是被除数还是只可以等于FFFF.

帮我指正下,被除数除以十得到各位ASCII码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-14 23:15:42 | 显示全部楼层
本帖最后由 pediyzhi 于 2012-11-14 23:17 编辑
乄ヤ灬风 发表于 2012-11-14 23:02
帮我指正下,被除数除以十得到各位ASCII码。

被除数除以10然后取余数加30h
详细的看我这个帖子,注释的很全
http://bbs.fishc.com/thread-21561-1-1.html
你可以参考下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-15 15:43:37 | 显示全部楼层
assume cs:code
data segment
        dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
        dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
        dd 1993,1994,1995
        ;以上偏移为0,数组元素偏移为4
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        ;以上偏移为84,数组元素偏移为4
        dd 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226     ;为了把所有的放在同一个循环里,这里用DD
        dd 11542,14430,15257,17800
        ;以上偏移为168,数组元素偏移为2
data ends

data2        segment
        db 1024 dup (0)
data2 ends

stack segment
        db 64 dup (0)
stack ends

code segment
                        ;处理数据为字符串
                        ;开始年份初始化
        start:        mov ax,        stack
                        mov ss,        ax
                        mov sp,        40h
                        mov ax,        data        ;原始数据段
                        mov ds,        ax
                        mov ax,        data2        ;临时存放数据段
                        mov es,        ax
                        mov bx,        0                ;原始数据段数据偏移
                        mov di,        0                ;临时存放数据段数据偏移
                        call arrange
                        ;初始化
                        mov ax,        data2        ;临时存放data2数据段
                        mov ds,        ax
                        ;写入缓存设置
                        mov dh,        2        ;行数
                        mov si,        0        ;字符偏移
                        mov cx,        21
                do5:push cx
                        mov cx,        4
                        mov dl,        2        ;列数
                do4:

                        push cx
                        push dx
                        mov cl,        2        ;颜色
                        call show_str
                        pop dx
                        pop        cx
                        
                        add dl,        10
                        loop do4
                        pop cx
                        inc dh
                        loop do5
                        
                        mov ax,4c00h
                        int 21h
                        
        arrange:
                        mov cx,21
                        ;年
                do3:push cx
                        mov cx,3
                        mov si,0
                do2:mov ax,[bx+si]
                        mov dx,[bx+si+2]
                        push cx
                        push bx
                        push si
                        mov si,0
                        call dtoc1
                        pop si
                        pop bx
                        pop cx
                        add si,84
                        ;add        bx,4
                        loop do2
                        push bx
                        mov ax,[bx+84]
                        mov dx,[bx+86]
                        mov cx,[bx+168]
                        call divdw
                        push si
                        mov si,0
                        call dtoc1
                        pop si
                        pop bx
                        pop cx
                        add bx,4
                        loop do3
                        ret
                        
                        
                dtoc1:        mov cx,        10        ;把数据转换为字符串
                                call divdw        ;返回结果dx=高16位,AX=低16位,CX为余数
                                mov bx,        cx
                                add bx,        30h                ;转换其中一个字符
                                push bx                        ;把转换好的字符推入栈中
                                inc si                        ;计数器加1
                                mov cx,        ax                ;根据余数判断是否继续
                                jcxz ok1                ;CX等于0则表示该段转换完成跳转
                                jmp short dtoc1        ;CX不等于0跳回去继续转换
                ok1:        mov cx,        si        ;根据计数设置循环
                                do1:pop bx
                                        mov es:[di],bl
                                        inc di
                                        loop do1
                                mov bl,        0
                                mov es:[di],bl
                                inc di
                                ret        ;call dtoc1返回
        
        
        
        
        
        
        
        show_str:        mov ax,        0b800h
                                mov es,        ax        ;写入显示缓存
                                mov al,        160
                                dec dh
                                mul dh                ;计算行数偏移
                                mov bx,        ax        ;保存行数偏移
                                mov al,        2
                                dec dl
                                mul dl                ;计算列数偏移
                                add        bx,        ax        ;计算所有偏移保存在bx中
                xr:                mov ch,        [si]
                                mov al,        cl
                                mov ah,        00
                                sub cx,        ax
                                inc si
                                jcxz        ok4
                                add cx,        ax
                                mov al,        ch
                                mov ah,        cl
                                mov es:[bx],        ax
                                add bx,        2
                                jmp short xr
                ok4:        ret        
        
        
        
        
        
        
        
        divdw:        mov bx,        ax        ;防溢出除法
                        mov ax,        dx
                        xor dx,        dx
                        div cx
                        push ax
                        mov ax,        bx
                        div cx
                        mov cx,        dx
                        pop dx
                        ret

code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-15 23:16:44 | 显示全部楼层
434344334.png
把算复制完了
代码:
 assume cs:codesg,ds:datasg,es:table,ss:stack
table segment
  db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  db '1984','1985','1986','1987','1988','1989','1990','1991','1991'
  db '1993','1994','1995'
  ;以上是表示21年的21个字符串
  
   dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
   dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000
  ;以上是表示21年公司总收入的21个dword型数据
  
  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型数据
  
  dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
  dw 260,304,333
  ;以上是表示21年公司人均收入
  
  dd 10 dup (0)
table ends
datasg segment
  
  db 1000 dup (0)
  
datasg ends
stack segment
  db 100 dup (0)
 
stack ends
codesg segment
  start:
          
            mov ax,datasg
   mov ds,ax
   
      mov ax,table
   mov es,ax
   mov si,0
   mov bp,0
   mov di,0
   
   mov ax,stack
   mov ss,ax
   mov sp,100
   
   mov cx,21               ;21次循环为总收入转换ASCII码
 s7:  call dtoc               
   add bp,16               ;bp加16换行
      add di,4                ;si+4
   loop s7
   
   mov ax,datasg
   mov ds,ax
   
      mov ax,table
   mov es,ax
   mov si,0
   mov bp,0
   mov di,0
   
   mov ax,stack
   mov ss,ax
   mov sp,100
   
   mov cx,21                 ;21次循环为总人数转换ASCII码
 s8:     call dtoc1
            add bp,16                 ;bp加16换行
            add di,2                  ;si+2
            loop s8
   
   mov ax,datasg
   mov ds,ax
   
      mov ax,table
   mov es,ax
   mov si,0
   mov bp,0
   mov di,0
   
   mov ax,stack
   mov ss,ax
   mov sp,100
   
   mov cx,21                 ;21次循环为平均收入转换ASCII码
 s9:     call dtoc2
            add bp,16                 ;bp加16换行
            add di,2                  ;si+2
            loop s9
   
   mov ax,datasg
   mov ds,ax
   
      mov ax,table
   mov es,ax
   mov si,0
   mov bp,0
   mov di,0
   
   mov ax,stack
   mov ss,ax
   mov sp,100
   
   mov cx,21                     ;21次循环年份
   
 s10:    call dtoc3
            add bp,16                     ;bp加16换行
            add di,4                      ;di+4
            loop s10
   
   mov ax,datasg
   mov ds,ax
   
      mov ax,0B800h
   mov es,ax
   mov si,0
   mov bp,0
   mov di,0
   
   mov ax,stack
   mov ss,ax
   mov sp,100
   
   mov dh,4
    
      mov dl,3
    
            mov cx,21
   
 s11:    call show_str
   add bp,16
   add dh,1
   loop s11
   
   mov ax,datasg
   mov ds,ax
   
      mov ax,0B800h
   mov es,ax
   mov si,0
   mov bp,0
   mov di,0
   
   mov ax,stack
   mov ss,ax
   mov sp,100
   
   mov dh,4
    
      mov dl,14
    
            mov cx,21
   
 s12:    call show_str1
   add bp,16
   add dh,1
   loop s12
   
   mov ax,datasg
   mov ds,ax
   
      mov ax,0B800h
   mov es,ax
   mov si,0
   mov bp,0
   mov di,0
   
   mov ax,stack
   mov ss,ax
   mov sp,100
   
   mov dh,4
    
      mov dl,28
    
            mov cx,21
   
 s13:    call show_str2
   add bp,16
   add dh,1
   loop s13
   
   mov ax,datasg
   mov ds,ax
   
      mov ax,0B800h
   mov es,ax
   mov si,0
   mov bp,0
   mov di,0
   
   mov ax,stack
   mov ss,ax
   mov sp,100
   
   mov dh,4
    
      mov dl,40
    
            mov cx,21
   
 s14:    call show_str3
   add bp,16
   add dh,1
   loop s14
   
            mov ax,4c00h
            int 21h   
       
  
 dtoc: 
       push cx
    push di
    push si
          push bp
    ;cx、si入栈

 s4:      
       mov ax,es:[di+54h]
       mov dx,es:[di+56h]
         
    
    mov bx,10
    
 s1:  mov bp,ax     ;转移到L位
   
   mov ax,dx     ;dx值等于ax
    
   xor dx,dx     ;-----------H转AX D清零
   
   div bx        ;H除以bx
         
   mov di,ax     ;H结果=di
   
   mov ax,bp     ;ax植出栈,L重赋给ax
   
   div bx        ;-----------REG+L/10  DX=余娄  H结果=DI
                       ;===========          L结果AX    
   
   mov cx,bp     ;商为零cx
   
   jcxz d_wk     ;-----------余数为空jmp 到出栈
   add dx,30h
         push dx
         inc si
         xor dx,dx
         ;------------余数+30H=ASCII
         mov dx,di
         ;------------H重赋给DX
         jmp s1
            ;------------判断H为0,不为0循环
            ;============          为0做L位除法
   
 d_wk:    mov cx,si 
            ;------------设定循环数
            ;------------CX为0 jmpECS
          
   jcxz s3       ;cx为零转移到s2
    

    
    mov si,0
    mov di,0            ;di等于0
    
 s3:   pop ax              ;dx植出栈放入ax
          
    mov es:[di+100h],al   ;[bp+di+05h]=al
    add di,1               ;di加1
              
     loop s3                 ;loop 循环
          
    pop bp       
    mov cx,di
          
 s2:   mov al,es:[si+100h]     
    mov ds:[si+bp+05h],al
    
    add si,1
    
    loop s2
    
 
 okay: pop si
       pop di
    pop cx     
    
    ret
    
   dtoc1: ;除以十得到余数加30H 
          push cx
    push di
    push si
          push bp
    ;cx、si入栈
 
    sl4:  mov ax,es:[di+0a8h]
 
    mov bx,0
    
 sl1:  mov cx,10d
          mov dx,0
          
    div cx
    
    mov cx,ax
    
    jcxz sl2
    
    add dx,30h
    push dx
    
    inc bx
    
    jmp short sl1
    
    sl2:  add dx,30h
       push dx
    inc bx
    
    mov cx,bx
    mov si,0
    
 sl3:  pop ax
          
    mov es:[si+100h],al
    inc si
    
    loop sl3
    
    pop bp
    mov di,0
    
    mov cx,si
    
 sl5:  mov al,es:[di+100h]     
    mov ds:[di+bp],al
    
    add di,1  
    
    loop sl5
 okay1: 
          pop si
    pop di
    pop cx   
        
    ret
    
  dtoc2:            ;21年平均收入
          ;除以十得到余数加30H 
          push cx
    push di
    push si
          push bp
    ;cx、si入栈
 
    sd4:  mov ax,es:[di+0d2h]
 
    mov bx,0
    
 sd1:  mov cx,10d
          mov dx,0
          
    div cx
    
    mov cx,ax
    
    jcxz sd2
    
    add dx,30h
    push dx
    
    inc bx
    
    jmp short sd1
    
    sd2:  add dx,30h
       push dx
    inc bx
    
    mov cx,bx
    mov si,0
    
 sd3:  pop ax
          
    mov es:[si+100h],al
    inc si
    
    loop sd3
    
    pop bp
    mov di,0
    
    mov cx,si
    
 sd5:  mov al,es:[di+100h]     
    mov ds:[di+bp+0ch],al
    
    add di,1  
    
    loop sd5
 okay2: 
          pop si
    pop di
    pop cx   
        
    ret
    
 dtoc3:                     ;21年年份放入ds段中
       push cx
    push di
    push si
    push bp
    
  sw4: mov ax,es:[di]
          mov dx,es:[di+2]
          
    mov di,0
    
    pop bp
    
    mov ds:[bp+150h],ax
    mov ds:[bp+152h],dx
    
    
 okay3:
       pop si
    pop di
    pop cx
    
    ret
 
 show_str:mov ax,0A0h
          mul dh
    
    mov bx,ax
    mov ax,2
    mul dl
    sub ax,2
    
    add bx,ax
    
    mov di,0
    
    
    mov al,ds:[bp+150h]  
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    add di,2
    mov ah,ds:[bp+151h]
    mov es:[bx+di],ah
    mov byte ptr es:[bx+di+1],02h
    add di,2
       mov al,ds:[bp+152h]
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    add di,2
    mov ah,ds:[bp+153h]
          mov es:[bx+di],ah
    mov byte ptr es:[bx+di+1],02h 
        
    
 ok:   ret   
    
    
show_str1:                    ;显示21年总收入
          mov ax,0A0h
          mul dh
    
    mov bx,ax
    mov ax,2
    mul dl
    sub ax,2
    
    add bx,ax
    
    mov di,0
    
    
    mov al,ds:[bp+5h]  
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    add di,2
    mov ah,ds:[bp+6h]
    mov es:[bx+di],ah
    mov byte ptr es:[bx+di+1],02h
    add di,2
       mov al,ds:[bp+7h]
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    add di,2
    mov ah,ds:[bp+8h]
          mov es:[bx+di],ah
    mov byte ptr es:[bx+di+1],02h 
          add di,2
    mov al,ds:[bp+9h]  
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    add di,2
    mov ah,ds:[bp+0Ah]
          mov es:[bx+di],ah
    mov byte ptr es:[bx+di+1],02h 
          add di,2
    mov al,ds:[bp+0Bh]  
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    
 okwy:
          ret 
    
show_str2:                 ;显示21年总人数
          mov ax,0A0h
          mul dh
    
    mov bx,ax
    mov ax,2
    mul dl
    sub ax,2
    
    add bx,ax
    
    mov di,0
    
    mov al,ds:[bp]  
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    add di,2
    mov ah,ds:[bp+1h]
    mov es:[bx+di],ah
    mov byte ptr es:[bx+di+1],02h
    add di,2
       mov al,ds:[bp+2h]
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    add di,2
    mov ah,ds:[bp+3h]
          mov es:[bx+di],ah
    mov byte ptr es:[bx+di+1],02h 
          add di,2
    mov al,ds:[bp+4h]  
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    
 okwl: 
          ret
    
show_str3:                  ;显示21年人均收入
          mov ax,0A0h
          mul dh
    
    mov bx,ax
    mov ax,2
    mul dl
    sub ax,2
    
    add bx,ax
    
    mov di,0
    
    mov al,ds:[bp+0ch]  
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    add di,2
    mov ah,ds:[bp+0dh]
    mov es:[bx+di],ah
    mov byte ptr es:[bx+di+1],02h
    add di,2
       mov al,ds:[bp+0eh]
    mov es:[bx+di],al
    mov byte ptr es:[bx+di+1],02h
    
 okyok: 
          ret 
codesg ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 10:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表