#2
Explorerlxz2014-06-07 11:15
|
只有本站会员才能查看附件,请 登录
程序代码:
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据
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型数据
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
moment segment
db 'year '
db 'su '
db 'e '
db '? '
moment ends
codesg segment
start: mov ax,data
mov ds,ax
mov si,0
mov ax,table
mov es,ax
mov di,0
mov bx,0a8h
mov cx,21
ta_ble: mov ax,[si] ;year
mov es:[di],ax
mov ax,[si+2]
mov es:[di+2],ax
mov ax,[si+54h] ;income
mov es:[di+5],ax
mov dx,[si+56h]
mov es:[di+7],dx
div word ptr [bx] ;average income
mov es:[di+0dh],ax
mov ax,[bx] ;number of employers
mov es:[di+0ah],ax
add bx,2
add si,4
add di,10h
loop ta_ble
;===============================================
;此时数据已经全部存放到table段中,下面的代码实现将
;table段中的数据转化成字符串,格式化输出到显示器上
;table位于附加段,moment位于数据段
;===============================================
mov ax,table
mov es,ax
mov di,0
mov ax,moment
mov ds,ax
mov si,0
mov cx,21
p:
mov ax,es:[di] ;year
mov [si],ax
mov ax,es:[di+2]
mov [si+2],ax
add di,5
add si,10
mov ax,es:[di] ;income
mov dx,es:[di+2]
call ddtoc;;;;;;;;;调整顺序时出错
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;断点1
add di,5
add si,10
mov ax,es:[di] ;number of employers
mov bx,si
call dtoc
add di,3
add si,10
mov ax,es:[di] ;average income
mov bx,si
call dtoc
add di,3
mov si,0
call print_data
loop p
mov ax,4c00h
int 21h
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;-------------------------------------
print_data:
push es
push si
push di
push cx
push bx
push ax
mov ax,0B800h
mov es,ax
mov ah,cl
mov al,25
sub al,ah;al表示行号的偏移地址
mov ah,0
mov bl,160
mul bl
mov di,ax
mov cx,40
begin:
mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],02
inc si
add di,2
loop begin
pop ax
pop bx
pop cx
pop di
pop si
pop es
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;dtoc函数:bx表示字符串起点,si表示字符串的终点
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
dtoc:
push si
push dx
push cx
push bx
push ax
div_10: mov dx,0;循环s用于得到所求数字每个字符,但是顺序与实际显示的相反
mov cx,10
div cx
add dl,30h
mov [si],dl
inc si
mov cx,ax
inc cx
loop div_10
dec si
go_on: mov al,[bx];循环go_on用于调整字符的顺序
mov cl,[si]
mov [bx],cl
mov [si],al
dec si
inc bx
cmp si,bx
ja go_on
over: pop ax
pop bx
pop cx
pop dx
pop si
ret
;--------------------------------------------------------------------
;ddtoc子程序实现将dword型数据转化成字符串
;--------------------------------------------------------------------
ddtoc:
push si
push dx
push cx
push bx
push ax
mov bx,si
ddt:
mov cx,10
call divdw
add cl,30h
mov [si],cl
inc si
mov cx,dx
jcxz half
mov cx,ax
inc cx
loop ddt
half:
call dtoc
pop ax
pop bx
pop cx
pop dx
pop si
ret
;.....................................................
;divdw结果中高位在dx,低位在ax,余数在cx
;.....................................................
divdw:
push di
push bx
mov bx,ax;bx暂存数据低位
mov di,dx;di暂存数据高位
mov ax,dx
mov dx,0
div cx
push ax;高位的商入栈
mov ax,bx
div cx
mov cx,dx
pop dx
pop bx
pop di
ret
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
codesg ends
end start
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据
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型数据
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
moment segment
db 'year '
db 'su '
db 'e '
db '? '
moment ends
codesg segment
start: mov ax,data
mov ds,ax
mov si,0
mov ax,table
mov es,ax
mov di,0
mov bx,0a8h
mov cx,21
ta_ble: mov ax,[si] ;year
mov es:[di],ax
mov ax,[si+2]
mov es:[di+2],ax
mov ax,[si+54h] ;income
mov es:[di+5],ax
mov dx,[si+56h]
mov es:[di+7],dx
div word ptr [bx] ;average income
mov es:[di+0dh],ax
mov ax,[bx] ;number of employers
mov es:[di+0ah],ax
add bx,2
add si,4
add di,10h
loop ta_ble
;===============================================
;此时数据已经全部存放到table段中,下面的代码实现将
;table段中的数据转化成字符串,格式化输出到显示器上
;table位于附加段,moment位于数据段
;===============================================
mov ax,table
mov es,ax
mov di,0
mov ax,moment
mov ds,ax
mov si,0
mov cx,21
p:
mov ax,es:[di] ;year
mov [si],ax
mov ax,es:[di+2]
mov [si+2],ax
add di,5
add si,10
mov ax,es:[di] ;income
mov dx,es:[di+2]
call ddtoc;;;;;;;;;调整顺序时出错
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;断点1
add di,5
add si,10
mov ax,es:[di] ;number of employers
mov bx,si
call dtoc
add di,3
add si,10
mov ax,es:[di] ;average income
mov bx,si
call dtoc
add di,3
mov si,0
call print_data
loop p
mov ax,4c00h
int 21h
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;-------------------------------------
print_data:
push es
push si
push di
push cx
push bx
push ax
mov ax,0B800h
mov es,ax
mov ah,cl
mov al,25
sub al,ah;al表示行号的偏移地址
mov ah,0
mov bl,160
mul bl
mov di,ax
mov cx,40
begin:
mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],02
inc si
add di,2
loop begin
pop ax
pop bx
pop cx
pop di
pop si
pop es
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;dtoc函数:bx表示字符串起点,si表示字符串的终点
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
dtoc:
push si
push dx
push cx
push bx
push ax
div_10: mov dx,0;循环s用于得到所求数字每个字符,但是顺序与实际显示的相反
mov cx,10
div cx
add dl,30h
mov [si],dl
inc si
mov cx,ax
inc cx
loop div_10
dec si
go_on: mov al,[bx];循环go_on用于调整字符的顺序
mov cl,[si]
mov [bx],cl
mov [si],al
dec si
inc bx
cmp si,bx
ja go_on
over: pop ax
pop bx
pop cx
pop dx
pop si
ret
;--------------------------------------------------------------------
;ddtoc子程序实现将dword型数据转化成字符串
;--------------------------------------------------------------------
ddtoc:
push si
push dx
push cx
push bx
push ax
mov bx,si
ddt:
mov cx,10
call divdw
add cl,30h
mov [si],cl
inc si
mov cx,dx
jcxz half
mov cx,ax
inc cx
loop ddt
half:
call dtoc
pop ax
pop bx
pop cx
pop dx
pop si
ret
;.....................................................
;divdw结果中高位在dx,低位在ax,余数在cx
;.....................................................
divdw:
push di
push bx
mov bx,ax;bx暂存数据低位
mov di,dx;di暂存数据高位
mov ax,dx
mov dx,0
div cx
push ax;高位的商入栈
mov ax,bx
div cx
mov cx,dx
pop dx
pop bx
pop di
ret
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
codesg ends
end start