注册 登录
编程论坛 汇编论坛

王爽汇编课程设计 1-------------练技术

Explorerlxz 发布于 2014-06-07 11:09, 3822 次点击
只有本站会员才能查看附件,请 登录

程序代码:
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
5 回复
#2
Explorerlxz2014-06-07 11:15
之前子程序设计不合理导致这次写程序很不顺利,不过经过改写,现在解决除法溢出子程序,数据转化成字符串子程序可移植性都大大增强了!自我感觉调试程序的技术也有所上升,感觉以后用OD应该会更有感觉,加油
#3
michaelHeave2014-06-27 09:42
#4
hu9jj2014-07-01 06:54
这就是水平提高的表现。
#5
zhu2240392014-07-02 02:50

very good
1