课程设计一
assume cs:code,ss:stack,ds:datadata segment
dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
dd 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
dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
dd 11542,14430,15257,17800
dd 32 dup (0)
data ends
stack segment
dw 32 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,64
mov bx,0
mov si,84
mov cx,21 ;13
kaa:
push cx ;
mov ax,
push ax
mov ax, ; 1a
push ax
pop dx
pop ax ;
call dtoc ;20
mov byte ptr ds:,2 ;23
mov dh,ds: ;显示年份
mov dl,2
mov cx,2
call sss ;31
;显示年份
;收入
mov ax, ;34
push ax
mov ax,
push ax
pop dx
pop ax
call dtoc ;3d
mov dh,ds: ;40 ;显示收入
mov dl,7
mov cx,2
call sss ;49
;显示收入
;人数
mov ax, ;4c
push ax
mov ax,
push ax
pop dx
pop ax
call dtoc ;56
mov dh,ds: ;59 ;显示人数
mov dl,15
mov cx,2
call sss ;62
;显示人数
mov ax, ;68 ;准备收入(被除数);69
push ax ;高16位
mov ax, ;68
push ax ; 低16位
mov ax, ;6c ;准备除数(人数)
push ax
pop cx ;;准备除平均
pop dx
pop ax ;6a
call divdw ;73 ;作除法
call dtoc ;76
mov dh,2 ;显示平均数
mov dl,20
mov cx,2
call sss ;80
inc dh
add bx,4 ;85
mov cl,ds: ;88
inc cl
mov ds:,cl
pop cx
loop kaa ;93
jx: mov ax,4c00h ;95
int 21h ;86
dtoc: ;抽取数字,并转化为SACII码
push dx
push cx
push ax
push si
push bx
mov bx,0 ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
s1: mov cx,10
call divdw ;a6
mov di,cx ;把余数给di临时保存
mov cx,ax ;商给CX,用来判断商是否为零; a4
jcxz s2 ;如果CX=0则跳到S1
mov cx,di ;恢复CX内值
add cx,30h ;余数加30H,得到相应的ASCII码 ,b1
push cx ;保存到栈
inc bx ;
jmp short s1
s2:
mov cx,di ;b8
add cx,30h ;商为0时,余数为个位,ba
push cx ;b6
inc bx ;be ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
mov cx,bx ;用CX出栈,把总进栈次数给CX
mov di,cx ;本程序中,用来保存长度
mov si,257 ;c3
mov ds:,cl
s3:
pop ax ;
mov ds:,al
inc si ;
loop s3 ;cd
;s3实现将栈中的数据依次出栈,放到指定内存
pop bx ;cf ;bx压进去对,取出来就不对了??
pop si ;
pop ax
pop cx
pop dx
ret ;d4
sss: ;子程序 用来显示
push bx
push si
push dx
mov ax,cx ;颜色给ax
mov cl,ds: ;d9 ds:{256]中的1怎么变成了4????
ss1a: push cx ;dd ;这里显示位置有问题!!!!
mov si,257 ;d2
callshow_str ;在指定位置显示 ,d5
inc si ;e4
inc dl
pop cx ;e7
loop ss1a ;e8
pop dx
pop si
pop bx
ret ;e2
divdw:;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数,b6
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
push si ;e4
push bx
push ax ;低16位先保存
mov ax,dx ;ax这时候的值是高16位了
mov dx,0 ;dx置零是为了不影响下边余数位,使得高16位为0
div cx ;H/N(16位除法)
mov bx,ax ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
pop ax ;ax的值现在是L(低16位)
div cx ;L/N(16除法),ax被除数低16位,dx被除数高16位
mov cx,dx
mov dx,bx
pop bx
pop si
ret ;107
show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
; ds:si指向字符串首地址
push cx ;cc
push si
mov cx,ax ;颜色给cx
mov ax,0b800h;显存的开始地址
mov es,ax ;10b ;ES中存放是显存的第0页(共0-7页)的起始段地址
mov al,160 ;每行80字符即160字节
dec dh ;第八行
mul dh ;111
mov bx,ax
mov al,2 ;一个字符占二字节
dec dl ;列从零开始,第三列,所以减一
mul dl
add bx,ax ;此时BX中放的是行与列的偏移地址
mov di,0 ;di 指向显存的偏移地址
mov al,cl ;把颜色参数,放到al;e6
mov si,257
mov cx,0
mov cl, ;128
mov si,258
str:
mov ah,ds: ;ds:指向‘Wlcome to masm!',0,,,,e8
mov es:,ah ;偶字节放字符
mov es:,al;奇字节放,颜色属性
inc si
loop str ;137
ok: pop si
pop cx
ret ;显示字符串的子程序【定义结束】;13b
code ends
end start
课程设计一完成了,但运行没有显示,不知道做的对不对;
谁帮我运行下,看这个完成没有 :handshake
上面的程序,把394行,换成:add si,2 最后改成这个样子,还是显示不出来;晕死了:mad:
assume cs:code,ss:stack,ds:data
data segment
dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
dd 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
dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
dd 11542,14430,15257,17800
dd 32 dup (0)
data ends
stack segment
dw 32 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,64
mov bx,0
mov si,84
mov cx,21 ;13
kaa:
push cx ;
mov ax,
push ax
mov ax, ; 1a
push ax
pop dx
pop ax ;
call dtoc ;20
mov byte ptr ds:,2 ;23
mov dh,ds: ;显示年份
mov dl,2
mov cx,2
call sss ;31
;显示年份
mov ax, ;34
push ax
mov ax,
push ax
pop dx
pop ax
call dtoc ;3d
mov dh,ds: ;40 ;显示收入
mov dl,7
mov cx,2
call sss ;49
mov ax, ;4c
push ax
mov ax,
push ax
pop dx
pop ax
call dtoc ;56
mov dh,ds: ;59 ;显示人数
mov dl,15
mov cx,2
call sss ;62
;显示人数
mov ax, ;68 ;准备收入(被除数);69
push ax ;高16位
mov ax, ;68
push ax ; 低16位
mov ax, ;6c ;准备除数(人数)
push ax
pop cx ;;准备除平均
pop dx
pop ax ;6a
call divdw ;73 ;作除法
call dtoc ;76
mov dh,2 ;显示平均数
mov dl,20
mov cx,2
call sss ;80
add byte ptr ds:,1 ;83
pop cx
dec cx ;89
jcxz jx ;
jmpkaa ;8c
jx: mov ax,4c00h ;8e
int 21h ;91
dtoc: ;抽取数字,并转化为SACII码
push dx
push cx
push ax
push si
push bx
mov bx,0 ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
s1: mov cx,10 ;9e
call divdw ;a6
mov di,cx ;把余数给di临时保存
mov cx,ax ;商给CX,用来判断商是否为零; a4
jcxz s2 ;如果CX=0则跳到S1
mov cx,di ;恢复CX内值
add cx,30h ;余数加30H,得到相应的ASCII码 ,a9
push cx ;保存到栈
inc bx ;
jmp short s1
s2:
mov cx,di ;b8
add cx,30h ;商为0时,余数为个位,b2
push cx ;b6
inc bx ;be ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
mov cx,bx ;用CX出栈,把总进栈次数给CX
mov di,cx ;本程序中,用来保存长度
mov si,257 ;bb
mov ds:,cl
s3:
pop ax ;
mov ds:,al
inc si ;
loop s3 ;c5
;s3实现将栈中的数据依次出栈,放到指定内存
pop bx ;cf ;bx压进去对,取出来就不对了??
pop si ;
pop ax
pop cx
pop dx
ret ;cc
sss: ;子程序 用来显示
push bx
push si
push dx
mov ax,cx ;颜色给ax
mov cl,ds: ;d2 ds:{256]中的1怎么变成了4????
ss1a: push cx ;d6 ;这里显示位置有问题!!!!
mov si,257 ;
callshow_str ;在指定位置显示 ,d5
inc si ;dd
inc dl
pop cx ;e0
loop ss1a ;e1
pop dx
pop si
pop bx
ret ;e6
divdw:;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数,b6
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
push si ;e7
push bx
push ax ;低16位先保存
mov ax,dx ;ax这时候的值是高16位了
mov dx,0 ;dx置零是为了不影响下边余数位,使得高16位为0
div cx ;H/N(16位除法)
mov bx,ax ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
pop ax ;ax的值现在是L(低16位)
div cx ;L/N(16除法),ax被除数低16位,dx被除数高16位
mov cx,dx
mov dx,bx
pop bx
pop si
ret ;fc
show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
; ds:si指向字符串首地址
push cx ;fd
push si
mov cx,ax ;颜色给cx
mov ax,0b800h;显存的开始地址
mov es,ax ;10b ;ES中存放是显存的第0页(共0-7页)的起始段地址
mov al,160 ;每行80字符即160字节
dec dh ;第八行
mul dh ;111
mov bx,ax
mov al,2 ;一个字符占二字节
dec dl ;列从零开始,第三列,所以减一
mul dl
add bx,ax ;此时BX中放的是行与列的偏移地址
mov di,0 ;di 指向显存的偏移地址
mov al,cl ;把颜色参数,放到al;e6
mov si,257 ;11b
mov cx,0
mov cl, ;
mov si,258
str:
mov ah,ds: ;ds:指向‘Wlcome to masm!',0,,,,e8
mov es:,ah ;偶字节放字符
mov es:,al;奇字节放,颜色属性
add si,2
loop str ;132
ok: pop si
pop cx
ret ;显示字符串的子程序【定义结束】;136
code ends
end start
把61行内容,改写到第34行! 真心看不懂,我是小白的说 :mad: 我终于把它写好了 :loveliness: 欢迎大家指导:big
assume cs:code,ss:stack,ds:data
data segment
dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
dd 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
dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
dd 11542,14430,15257,17800
dd 32 dup (0)
data ends
stack segment
dw 32 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,64
mov byte ptr ds:,5
mov bx,0
mov si,84
mov cx,21 ;13
kaa:
push cx ;
mov ax, ;1c
push ax
mov ax, ;
push ax
pop dx
pop ax ;
call dtoc ;25
mov dh,ds: ;28 ;显示年份
mov dl,3
mov cx,2
call show_str ;31
mov ax, ;34
push ax
mov ax,
push ax
pop dx
pop ax
call dtoc ;3d
mov dh,ds: ;40 ;显示收入
mov dl,12
mov cx,3
call show_str ;49
mov ax, ;4c
push ax
mov ax,
push ax
pop dx
pop ax
call dtoc ;56
mov dh,ds: ;59 ;显示人数
mov dl,25
mov cx,4
call show_str ;62
;显示人数
mov ax, ;65 ;准备收入(被除数);69
push ax ;高16位
mov ax, ;68
push ax ; 低16位
mov ax, ;6 ;准备除数(人数)
push ax
pop cx ;;准备除平均
pop dx
pop ax ;
call divdw ;73 ;作除法
call dtoc ;76
mov dh,ds:
mov dl,33
mov cx,5
call show_str ;80
add byte ptr ds:,1 ;
add bx,4 ;86
pop cx
dec cx ;
jcxz jx ;8f
jmpkaa ;
jx: mov ax,4c00h ;93
int 21h ;
dtoc: ;抽取数字,并转化为SACII码
push dx
push cx
push ax
push si
push bx
mov bx,0 ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
s1: mov cx,10 ;9e
call divdw ;a6
mov di,cx ;把余数给di临时保存
mov cx,ax ;商给CX,用来判断商是否为零; a4
jcxz s2 ;如果CX=0则跳到S1
mov cx,di ;恢复CX内值
add cx,30h ;余数加30H,得到相应的ASCII码 ,a9
push cx ;保存到栈
inc bx ;
jmp short s1
s2:
mov cx,di ;b8
add cx,30h ;商为0时,余数为个位,b2
push cx ;b6
inc bx ;be ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
mov cx,bx ;用CX出栈,把总进栈次数给CX
mov di,cx ;本程序中,用来保存长度
mov si,273 ;bb
mov ds:,cl
s3:
pop ax ;
mov ds:,al
inc si ;
loop s3 ;c5
;s3实现将栈中的数据依次出栈,放到指定内存
pop bx ;cf ;bx压进去对,取出来就不对了??
pop si ;
pop ax
pop cx
pop dx
ret ;cc
divdw:;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数,b6
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
push si ;e7
push bx
push ax ;低16位先保存
mov ax,dx ;ax这时候的值是高16位了
mov dx,0 ;dx置零是为了不影响下边余数位,使得高16位为0
div cx ;H/N(16位除法)
mov bx,ax ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
pop ax ;ax的值现在是L(低16位)
div cx ;L/N(16除法),ax被除数低16位,dx被除数高16位
mov cx,dx
mov dx,bx
pop bx
pop si
ret ;fa
show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
; ds:si指向字符串首地址
push cx ;fd
push si
push bx
push dx
mov cx,ax ;颜色给cx
mov ax,0b800h;显存的开始地址
mov es,ax ;10b ;ES中存放是显存的第0页(共0-7页)的起始段地址
mov al,160 ;每行80字符即160字节
dec dh ;第八行
mul dh ;111
mov bx,ax
mov al,2 ;一个字符占二字节
dec dl ;列从零开始,第三列,所以减一
mul dl
add bx,ax ;此时BX中放的是行与列的偏移地址
mov di,0 ;di 指向显存的偏移地址
mov al,cl ;把颜色参数,放到al;e6
mov si,273 ;11b
mov cx,0
mov cl, ;
str:
mov ah,ds: ;ds:指向‘Wlcome to masm!',0,,,,e8
mov es:,ah ;偶字节放字符
mov es:,al;奇字节放,颜色属性
inc si
add bx,2
loop str ;132
ok:
pop dx
pop bx
pop si
pop cx
ret ;显示字符串的子程序【定义结束】;136
code ends
end start
改变:64、84、106、142行cx 值,就可改变数字颜色:titter: 不错,学习了
页:
[1]