王爽汇编课程设计 1-------------练技术
程序代码:
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