如何21年总收入放入ds:si21次循环
assume cs:codesg,ds:datasg,es:table,ss:stacktable 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 22:10 编辑
http://bbs.fishc.com/thread-21561-1-1.html
看我的这个.课程设计1,详细注释
呵呵,来抢分了{:5_108:}
这是课程设计1的题目, 有答案可以告诉下在哪啊。 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 static/image/common/back.gif
每个人思路不同,这是俺自己的~~
编辑不过去, 第二份答案,一样编辑出错?? 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:06 static/image/common/back.gif
乄ヤ灬风 发表于 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 {:5_96:} 没有加word ptr 嘿嘿!! 显出出来了, 乄ヤ灬风 发表于 2012-11-14 21:21 static/image/common/back.gif
显出出来了,
嗯。。。结贴吧~~~哥!!{:5_95:} 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:01 static/image/common/back.gif
我改的,还是被除数还是只可以等于FFFF.
帮我指正下,被除数除以十得到各位ASCII码。 本帖最后由 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
你可以参考下
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
把算复制完了
代码:
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]