- [fenglixin70953] assume cs:code ;实验14,显示当前日期,时间 code segment 09/28 09:54
- [fenglixin70953] assume cs:code data segment db '1975','1976 09/16 17:38
- [fenglixin70953] 看了论坛的贴子,终于会了 assume cs:code code segment 05/06 18:41
- [游客] 谢谢楼上改下面这样可以成功,但用直接定址表如何实现拷贝后子程序中sub标号的定位呢。没想出来。 a 05/04 13:55
- [游客] 中断例程中的的call自己例程中子程序,应该是用jmp基于偏移变量跳转,而不能单纯的call,因为子 05/03 18:48
- [游客] table dw sub1,sub2,sub3,sub4 ------- 定址表应该用偏移距离 05/03 18:43
- [fenglixin70953] s: mov dl,0 mov cx,49 s5: pus 04/28 11:01
- [hychewei] 看不懂!!能讲讲不?还有为什么没有那么伪代码? 04/23 22:23
- [fenglixin70953] 呵 04/17 22:20
- [wdm] 不错。不过,程序没有注释和分析,就会像僵尸一样干瘪啊。 04/17 20:01
[2008-09-16 17:37] 课程1两种实现方法
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988'
db '1989','1990','1991','1992','1993','1994','1995' ;年份
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,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 ;人数
data ends
table segment
db 105 dup(0)
db 231 dup(0)
db 126 dup(0)
db 126 dup(0)
table ends
code segment
start:mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0 ;代表data段数的基址
mov si,0 ;table段基址
mov cx,21
s1:mov ax,[bx] ;把年份传到table段中,使其每个年后加0
mov es:[bx][si],ax
mov ax,[bx+2]
mov es:[bx].2[si],ax
inc si
add bx,4
loop s1
mov si,105 ;收入传入table段
mov bx,84
mov cx,21
s2:mov ax,[bx]
mov dx,[bx+2]
call dtoc
add si,11
add bx,4
loop s2
mov si,336 ;人数传入table段
mov bx,168
mov cx,21
s3:mov ax,[bx]
mov dx,0
call dtoc
add si,6
add bx,2
loop s3
mov si,462 ;算出商传入table段
mov cx,21
mov bx,0
mov di,0
s4:push cx
mov ax,[bx].84
mov dx,[bx].86
mov cx,[di].168
call divdw
call dtoc
add bx,4
add di,2
add si,6
pop cx
loop s4
mov cx,21
mov si,0
mov dh,3
s5: push cx
mov dl,3
mov cl,2
call show_str
inc dh
add si,5
pop cx
loop s5
mov cx,21
mov si,105
mov dh,3
s6: push cx
mov dl,23
mov cl,2
call show_str
inc dh
add si,11
pop cx
loop s6
mov cx,21
mov si,336
mov dh,3
s7: push cx
mov dl,49
mov cl,2
call show_str
inc dh
add si,6
pop cx
loop s7
mov cx,21
mov si,462
mov dh,3
s8: push cx
mov dl,70
mov cl,2
call show_str
inc dh
add si,6
pop cx
loop s8
mov ax,4c00h
int 21h
show_str: ;输出字符子程序
push ds
push es
push cx
push bx
push dx
push si
push di
mov ax,table
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax
mov dl,cl
mov di,0
s9:mov cl,[si]
mov ch,0
jcxz sss
mov al,[si]
mov es:[bx+di],al
mov es:[bx+di+1],dl
inc si
add di,2
jmp short s9
sss:pop di
pop si
pop dx
pop bx
pop cx
pop es
pop ds
ret
dtoc: ;变字符子程序
push cx
push bx
push dx
push si
push di
mov di,0
char:inc di
mov cx,10
call divdw ;提供ax,dx,cx值代入子程序
add cx,30h
push cx
mov bx,ax
or ax,dx
mov cx,ax
mov ax,bx
jcxz ok
jmp short char
ok:mov cx,di
ok1:pop es:[si]
inc si
loop ok1
pop di
pop si
pop dx
pop bx
pop cx
ret
divdw:
push bx ;除法运算
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
code ends
end start
第一种
[ fenglixin70953 发表于 2008-09-16 17:38 ]
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990'
db '1991','1992','1993','1994','1995' ;年份
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827,803530,1183000,184300
dd 2759000,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 ;人数
data ends
stack segment
dw 10h dup(0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,20h
mov ax,0b800h
mov es,ax
mov si,0
mov dh,3 ;在哪行显示
mov dl,4 ;在哪列显示
call bp_value ;计算输出显示器上的位置bp
mov cx,21
s:push cx
mov cl,0f1h
call show_str ;调用子程序显示年份
add bp,160
add si,4
pop cx
loop s
mov si,84
mov dh,3 ;行
mov dl,14 ;列
call bp_value ;算出位置
mov cx,21
s1:push cx
mov cl,2h
mov ax,[si] ;数据传递
mov dx,[si+2]
call dtoc ;调用子程序显示收入
add bp,160
add si,4
pop cx
loop s1
mov si,168
mov dh,3
mov dl,34
call bp_value
mov cx,21
s2:push cx
mov cl,41h
mov ax,[si]
mov dx,0
call dtoc ;显示人数
add bp,160
add si,2
pop cx
loop s2
mov si,84
mov di,168
mov dh,3
mov dl,54
call bp_value
mov cx,21
s3:push cx
mov ax,[si]
mov dx,[si+2]
mov cx,[di]
call divdw ;求商
mov cl,2h ;设置色
call dtoc ;显示商
add bp,160
add si,4
add di,2
pop cx
loop s3
mov ax,4c00h
int 21h
;以下是子程序
bp_value:push bx
push ax
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax
mov bp,bx
pop ax
pop bx
ret ;计算bp显示位置子程序
show_str:push bp
push si
push cx
mov dl,cl
mov cx,4
s4: mov al,[si]
mov es:[bp],al
mov es:[bp+1],dl
add bp,2
inc si
loop s4
pop cx
pop si
pop bp
ret ;显示年份子程序
divdw: push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret ;无溢出除法
dtoc:push si
push bp
push bx
push di
push cx
mov si,cx
mov di,0
s5: inc di
mov cx,10
call divdw
add cx,30h
push cx
mov bx,ax
or ax,dx
mov cx,ax
jcxz ok
mov ax,bx
jmp short s5
ok: mov cx,di
mov dx,si
s6:pop ax
mov es:[bp],al
mov es:[bp+1],dl
add bp,2
loop s6
pop cx
pop di
pop bx
pop bp
pop si
ret
code ends
end start