- [zaixuexi] 我以为是a0=0,a1=1,没仔细看 02/12 09:23
- [yang5731] 不对吧 我的结果应该是对的 N=9时 确实得217 你自己算算。你帮我看看论坛 算法上的程序吧 题 02/11 23:49
- [zaixuexi] 递归不是这么写的哦,我想你肯定没调试过自己写的这代码. 先看C代码吧: unsigned int 02/11 22:58
- [游客] <a href="http://www.playren.com/">整人方法</a> 12/15 17:11
- [wisji8] mov ax,0a0h mul dh mov bx,ax mov ax,2 mul 10/03 16:56
- [yang5731] 谢谢了 课程设计一做出来了 确实不能调用着个····· 08/25 02:50
- [mywiil] 课程设计一要用到这个子程序,这里暂不做评论。 赶紧完成课程设计一吧。 08/21 03:33
[2010-08-25 02:44] 课程设计1
;思路:要把DATA中的双字节数字转换成十进制的字符串,所占内存不等,直接转换肯定不行,
;我就新定义了一个TABLE段,把DATA段、STACK段中的数据转换成所占内存相等的字符串存进来,
;再将TABLE段中的数据显示出来
assume cs:code
data segment
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
stack 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'
stack ends
table segment
dd 84 dup (0,0,0,0,0,0,0,0)
table ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,0
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
nf: pop es:[si] ;NF 为年份
pop es:[si+2]
add si,8
loop nf
mov bx,si
mov ax,data
mov ds,ax
sub si,si
mov cx,21
sr: mov ax,[si] ;RS为收入
mov dx,[si+2]
call dtoc
add si,4
add bx,8
loop sr
mov cx,21
rs: mov ax,[si] ;RS 为人数
mov dx,0
call dtoc
add si,2
add bx,8
loop rs
sub si,si
add di,84
mov cx,21
rj: push cx ;RJ为人均收入
mov ax,[si]
mov dx,[si+2]
mov cx,[di]
call divdw
call dtoc
add si,4
add di,2
add bx,8
pop cx
loop rj
mov ax,table
mov ds,ax
mov dh,3
mov dl,3
mov si,0
mov cx,4
xs: call show_str
add dl,20
loop xs
mov ax,4c00h
int 21h
;子程序DTOC功能:将DATA段中的一个DWORD数据转换成十进制的字符串,
;参数:AX=DWORD数据的低16位,DX=DWORD数据的高16位
dtoc: push si
push bx
push cx
push di
push bp
mov di,0ah ;转换成几进制就除几
mov si,0
mov cx,di ;这里CX只要不得1就行
s1: push ax
mov ax,dx
mov dx,0
div di
mov bp,ax ;保存高16位的商
pop ax
div di
add dx,30h
push dx
mov dx,bp
inc si ;这里用SI计算循环次数,这个循环得到十进制字符串,不过是倒着排列的
mov cx,ax
inc cx ;这CX+1主要是让CX=1时不触发跳转 本来是用MUL CX的 但是会改变DX的值,
jcxz s2
loop s1 ;CX-1
s2: mov cx,si
sub si,si
s3: pop dx ;将十进制字符串顺过来
mov es:[si+bx],dl ;这里ES指向TABKE
inc si
loop s3
pop bp
pop di
pop cx
pop bx
pop si
ret
;子程序DIVDW功能:不会产生溢出的除法运算
;参数:AX=AX=DWORD数据的低16位,DX=DWORD数据的高16位,CX=除数
;返回:AX=商低16位,DX=商的高16位,CX=余数
divdw: push bx
push di
push bp
mov di,ax
mov ax,dx
mov dx,0
div cx
mov bp,ax
mov ax,di
div cx
mov cx,dx
mov dx,bp
pop bp
pop di
pop bx
ret
;子程序SHOW_STR功能:在屏幕中显示21行,每行8个字符串
;参数:DH=行数,DL=列数,
show_str: push ax
push dx
push cx
mov ax,0b800h
mov es,ax
mov cl,2 ;这里CL为颜色,本来放主程序的,但是主程序也要用到,不好保存就写进子程序了
mov ax,2
mul dl
mov bx,ax
sub bx,2
mov ax,0a0h
sub dh,1
mul dh
add bx,ax
mov ah,cl
mov di,0
mov cx,21 ;输出21行
s: push cx
mov di,0
mov cx,8 ;循环输出8个字符
a: mov al,ds:[si]
mov es:[bx+di],ax
inc si
add di,2
loop a
pop cx
add bx,0a0h ;换行
loop s
pop cx
pop dx
pop ax
ret
mov ax,4c00h
int 21h
code ends
end start
;我就新定义了一个TABLE段,把DATA段、STACK段中的数据转换成所占内存相等的字符串存进来,
;再将TABLE段中的数据显示出来
assume cs:code
data segment
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
stack 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'
stack ends
table segment
dd 84 dup (0,0,0,0,0,0,0,0)
table ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,0
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
nf: pop es:[si] ;NF 为年份
pop es:[si+2]
add si,8
loop nf
mov bx,si
mov ax,data
mov ds,ax
sub si,si
mov cx,21
sr: mov ax,[si] ;RS为收入
mov dx,[si+2]
call dtoc
add si,4
add bx,8
loop sr
mov cx,21
rs: mov ax,[si] ;RS 为人数
mov dx,0
call dtoc
add si,2
add bx,8
loop rs
sub si,si
add di,84
mov cx,21
rj: push cx ;RJ为人均收入
mov ax,[si]
mov dx,[si+2]
mov cx,[di]
call divdw
call dtoc
add si,4
add di,2
add bx,8
pop cx
loop rj
mov ax,table
mov ds,ax
mov dh,3
mov dl,3
mov si,0
mov cx,4
xs: call show_str
add dl,20
loop xs
mov ax,4c00h
int 21h
;子程序DTOC功能:将DATA段中的一个DWORD数据转换成十进制的字符串,
;参数:AX=DWORD数据的低16位,DX=DWORD数据的高16位
dtoc: push si
push bx
push cx
push di
push bp
mov di,0ah ;转换成几进制就除几
mov si,0
mov cx,di ;这里CX只要不得1就行
s1: push ax
mov ax,dx
mov dx,0
div di
mov bp,ax ;保存高16位的商
pop ax
div di
add dx,30h
push dx
mov dx,bp
inc si ;这里用SI计算循环次数,这个循环得到十进制字符串,不过是倒着排列的
mov cx,ax
inc cx ;这CX+1主要是让CX=1时不触发跳转 本来是用MUL CX的 但是会改变DX的值,
jcxz s2
loop s1 ;CX-1
s2: mov cx,si
sub si,si
s3: pop dx ;将十进制字符串顺过来
mov es:[si+bx],dl ;这里ES指向TABKE
inc si
loop s3
pop bp
pop di
pop cx
pop bx
pop si
ret
;子程序DIVDW功能:不会产生溢出的除法运算
;参数:AX=AX=DWORD数据的低16位,DX=DWORD数据的高16位,CX=除数
;返回:AX=商低16位,DX=商的高16位,CX=余数
divdw: push bx
push di
push bp
mov di,ax
mov ax,dx
mov dx,0
div cx
mov bp,ax
mov ax,di
div cx
mov cx,dx
mov dx,bp
pop bp
pop di
pop bx
ret
;子程序SHOW_STR功能:在屏幕中显示21行,每行8个字符串
;参数:DH=行数,DL=列数,
show_str: push ax
push dx
push cx
mov ax,0b800h
mov es,ax
mov cl,2 ;这里CL为颜色,本来放主程序的,但是主程序也要用到,不好保存就写进子程序了
mov ax,2
mul dl
mov bx,ax
sub bx,2
mov ax,0a0h
sub dh,1
mul dh
add bx,ax
mov ah,cl
mov di,0
mov cx,21 ;输出21行
s: push cx
mov di,0
mov cx,8 ;循环输出8个字符
a: mov al,ds:[si]
mov es:[bx+di],ax
inc si
add di,2
loop a
pop cx
add bx,0a0h ;换行
loop s
pop cx
pop dx
pop ax
ret
mov ax,4c00h
int 21h
code ends
end start
评论次数(0) |
浏览次数(441) |
类型(汇编作业) |
收藏此文 |