过默 发表于 2012-11-14 14:13:30

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

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:
       mov dx,es:
         

    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:,al   ;=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



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

pediyzhi 发表于 2012-11-14 14:13:31

本帖最后由 pediyzhi 于 2012-11-14 22:10 编辑

http://bbs.fishc.com/thread-21561-1-1.html
看我的这个.课程设计1,详细注释
呵呵,来抢分了{:5_108:}

过默 发表于 2012-11-14 14:14:51

这是课程设计1的题目, 有答案可以告诉下在哪啊。

s0512 发表于 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:
            mov ch,0
            inc bp
            jcxz xswk
            mov es:,cl
            inc di
            mov es:,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/10DX=余娄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:
            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:
            mov ds:0d2h,ax
            mov ax,ds:2
            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:
            mov dx,ds:2
            ;-------------------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   
            mov dx,0
            call dtoc
            call show_str
            pop si                     
;===============================================================================
;==========================平均pingjun==========================================
pingjun:    push si
            push bx
            push di
            push bp
            ;-------------------;保存数据
            mov ax,ds:
            mov dx,ds:2
            ;-------------------DX&AX赋值 被除数
            mov bx,ds:0A8H
            ;-------------------BX赋值    除数
            call divdd
            
            
            pop bp
            pop di
            pop bx
            pop si
            ret
                                                         
code ends
end strat

s0512 发表于 2012-11-14 18:20:24

每个人思路不同,这是俺自己的~~

过默 发表于 2012-11-14 19:03:13

s0512 发表于 2012-11-14 18:20 static/image/common/back.gif
每个人思路不同,这是俺自己的~~

编辑不过去,

过默 发表于 2012-11-14 19:05:29

第二份答案,一样编辑出错??

过默 发表于 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:

   mov ,ax

   mov ax,es:.2

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

   add si,6

   mov ax,es:.84

   mov dx,es:.86

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

   add si,10

   mov ax,es:.168

   mov dx,0

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

   add si,6

   mov ax,es:.210

   mov dx,0

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

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

b:   mov cx,29

c:   push cx

   mov cl,

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

d:   inc si

   pop cx

   loop c

   inc si

   mov al,0

   mov ,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 ,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 ,al

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

   loop d23

   mov al,0

   mov ,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,

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

   mov es:,ch

   mov es:.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

过默 发表于 2012-11-14 19:07:57

乄ヤ灬风 发表于 2012-11-14 19:06 static/image/common/back.gif


s0512 发表于 2012-11-14 20:14:27

乄ヤ灬风 发表于 2012-11-14 19:07 static/image/common/back.gif


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:
            mov ch,0
            inc bp
            jcxz xswk
            mov es:,cl
            inc di
            mov word ptr es:,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/10DX=余娄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:
            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:
            mov ds:0d2h,ax
            mov ax,ds:2
            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:
            mov dx,ds:2
            ;-------------------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   
            mov dx,0
            call dtoc
            call show_str
            pop si                     
;===============================================================================
;==========================平均pingjun==========================================
pingjun:    push si
            push bx
            push di
            push bp
            ;-------------------;保存数据
            mov ax,ds:
            mov dx,ds:2
            ;-------------------DX&AX赋值 被除数
            mov bx,ds:0A8H
            ;-------------------BX赋值    除数
            call divdd
            
            
            pop bp
            pop di
            pop bx
            pop si
            ret
                                                         
code ends
end strat

s0512 发表于 2012-11-14 20:15:11

{:5_96:} 没有加word ptr 嘿嘿!!

过默 发表于 2012-11-14 21:21:31

显出出来了,

s0512 发表于 2012-11-14 21:27:37

乄ヤ灬风 发表于 2012-11-14 21:21 static/image/common/back.gif
显出出来了,

嗯。。。结贴吧~~~哥!!{:5_95:}

过默 发表于 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:
              mov dx,es:
         

                  

                  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:,al   ;=al
                  add di,1                      ;di加1
                                                      
                  loop s3               ;loop 循环
         
                  jmp short s5



        okay: pop di
                  pop cx                          
                  
                  ret

codesg ends

end start
我改的,还是被除数还是只可以等于FFFF.

过默 发表于 2012-11-14 23:02:58

乄ヤ灬风 发表于 2012-11-14 23:01 static/image/common/back.gif
我改的,还是被除数还是只可以等于FFFF.

帮我指正下,被除数除以十得到各位ASCII码。

pediyzhi 发表于 2012-11-14 23:15:42

本帖最后由 pediyzhi 于 2012-11-14 23:17 编辑

乄ヤ灬风 发表于 2012-11-14 23:02 static/image/common/back.gif
帮我指正下,被除数除以十得到各位ASCII码。
被除数除以10然后取余数加30h
详细的看我这个帖子,注释的很全
http://bbs.fishc.com/thread-21561-1-1.html
你可以参考下

博丽灵梦 发表于 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,
                        mov dx,
                        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,
                        mov dx,
                        mov cx,
                        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:,bl
                                        inc di
                                        loop do1
                                mov bl,        0
                                mov es:,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,       
                                mov al,        cl
                                mov ah,        00
                                sub cx,        ax
                                inc si
                                jcxz        ok4
                                add cx,        ax
                                mov al,        ch
                                mov ah,        cl
                                mov es:,        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

过默 发表于 2012-11-15 23:16:44


把算复制完了
代码:

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:
       mov dx,es:
         
   
    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/10DX=余娄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:,al   ;=al
    add di,1               ;di加1
            
   loop s3               ;loop 循环
         
    pop bp      
    mov cx,di
         
s2:   mov al,es:   
    mov ds:,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:

    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:,al
    inc si
   
    loop sl3
   
    pop bp
    mov di,0
   
    mov cx,si
   
sl5:mov al,es:   
    mov ds:,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:

    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:,al
    inc si
   
    loop sd3
   
    pop bp
    mov di,0
   
    mov cx,si
   
sd5:mov al,es:   
    mov ds:,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:
          mov dx,es:
         
    mov di,0
   
    pop bp
   
    mov ds:,ax
    mov ds:,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:
    mov es:,al
    mov byte ptr es:,02h
    add di,2
    mov ah,ds:
    mov es:,ah
    mov byte ptr es:,02h
    add di,2
       mov al,ds:
    mov es:,al
    mov byte ptr es:,02h
    add di,2
    mov ah,ds:
          mov es:,ah
    mov byte ptr es:,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:
    mov es:,al
    mov byte ptr es:,02h
    add di,2
    mov ah,ds:
    mov es:,ah
    mov byte ptr es:,02h
    add di,2
       mov al,ds:
    mov es:,al
    mov byte ptr es:,02h
    add di,2
    mov ah,ds:
          mov es:,ah
    mov byte ptr es:,02h
          add di,2
    mov al,ds:
    mov es:,al
    mov byte ptr es:,02h
    add di,2
    mov ah,ds:
          mov es:,ah
    mov byte ptr es:,02h
          add di,2
    mov al,ds:
    mov es:,al
    mov byte ptr es:,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:
    mov es:,al
    mov byte ptr es:,02h
    add di,2
    mov ah,ds:
    mov es:,ah
    mov byte ptr es:,02h
    add di,2
       mov al,ds:
    mov es:,al
    mov byte ptr es:,02h
    add di,2
    mov ah,ds:
          mov es:,ah
    mov byte ptr es:,02h
          add di,2
    mov al,ds:
    mov es:,al
    mov byte ptr es:,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:
    mov es:,al
    mov byte ptr es:,02h
    add di,2
    mov ah,ds:
    mov es:,ah
    mov byte ptr es:,02h
    add di,2
       mov al,ds:
    mov es:,al
    mov byte ptr es:,02h
   
okyok:
          ret
codesg ends
end start
页: [1]
查看完整版本: 如何21年总收入放入ds:si21次循环