|
主题 : : 我写的实验10的子程序,大家看看,找找不足 [待解决] |
回复[ 6次 ]
点击[ 321次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-12-23 23:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-10-14 19:20 |
第一个是显示子程序
show_str:push dx
push es
push ax
push si
push di
push cx
mov al,dh
mov dh,160
mul dh
mov dh,0
add dx,dx
add ax,dx
mov di,ax
mov ax,0b800h
mov es,ax
mov al,cl
s:mov cl,[si]
mov ch,0
jcxz ok
mov byte ptr es:[di],cl
mov byte ptr es:[di+1],al
inc si
add di,2
jmp short s
ok:pop cx
pop di
pop si
pop ax
pop dx
pop es
ret
第二个是解决除法益处的
divdw:push bx
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
pop bx
ret
第三个是数值显示的问题
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:push cx
push dx
push si
mov dx,0
dtoc_s:mov cx,10
call divdw
jcxz dtoc_ok
add cx,30H
push cx
inc si
jmp short dtoc_s
dtoc_ok:mov cx,si
mov si,0
dtoc_s1:pop [si]
inc si
loop dtoc_s1
pop si
pop dx
pop cx
ret
divdw:push bx
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
pop bx
ret
show_str:push dx
push es
push ax
push si
push di
push cx
mov al,dh
mov dh,160
mul dh
mov dh,0
add dx,dx
add ax,dx
mov di,ax
mov ax,0b800h
mov es,ax
mov al,cl
show_str_s:mov cl,[si]
mov ch,0
jcxz show_str_ok
mov es:[di],cl
mov es:[di+1],al
inc si
add di,2
jmp short show_str_s
show_str_ok:pop cx
pop di
pop si
pop ax
pop dx
pop es
ret
code ends
end start
大家找找我的不足 | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-12-25 14:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
看代码还是蛮精炼的。不错 ^_^
mov byte ptr es:[di],cl
mov byte ptr es:[di+1],al
------------
这个是第一个子程序的,可以把颜色和数值放到一个16位寄存器中,这样就不用byte ptr标明了。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-01-05 22:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-01-05 21:48 |
mov byte ptr es:[di],cl
mov byte ptr es:[di+1],al
这个 本身就可以 不用 byte ptr 的 因为 cl,al 已经指明是8位操作了 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-01-12 22:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-01-11 14:49 |
我也发一个,请大家拍砖。谢谢!
data segment
string db 'Hello,Assembly World!',0
data ends
stack segment
dw 32 dup(?)
stack ends
assume cs:code,ss:stack,ds:data
code segment
start: mov ax,data
mov ds,ax ;设置段地址
mov ax,stack
mov ss,ax ;设置栈地址
mov ax,0B800h
mov es,ax ;设置附加段地址,显示缓冲区地址
mov si,offset string;设置源字符串首地址
;mov di,1FFh ;设置目的地址
mov dh,12 ;设置行
mov dl,30 ;设置列
call ShowStr ;调用显示以\0结束的字符串函数
jmp exit
exit: mov ax,4c00h ;程序结束
int 21h
;显示字符子模块------------------------------------------------------
;源地址寄存器si,行地址ah,列地址al-----------------------------------
ShowStr:
push cx ;保存环境
push di
push ax
mov di,dx ;将列地址传入di
and di,00FFh ;取低位列地址
mov al,80
mul dh
add di,ax
add di,di
ShowStrBG:mov ch,0
mov cl,ds:[si]
jcxz ShowStrOK ;判断是否为结束符\0
mov es:[di],cl
inc di
mov es:[di],0ACh
inc si
inc di
jmp ShowStrBG
ShowStrOK:pop ax
pop di
pop cx ;恢复环境
ret
code ends
end start | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-01-12 22:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-01-11 14:49 |
我也发一个,请大家拍砖。谢谢!(重新发一个对齐版)
data segment
string db 'Hello,Assembly World!',0
data ends
stack segment
dw 32 dup(?)
stack ends
assume cs:code,ss:stack,ds:data
code segment
start: mov ax,data
mov ds,ax ;设置段地址
mov ax,stack
mov ss,ax ;设置栈地址
mov ax,0B800h
mov es,ax ;设置附加段地址,显示缓冲区地址
mov si,offset string;设置源字符串首地址
mov dh,12 ;设置行
mov dl,30 ;设置列
call ShowStr ;调用显示以\0结束的字符串函数
jmp exit
exit: mov ax,4c00h ;程序结束
int 21h
;显示字符子模块------------------------------------------------------
;源地址寄存器si,行地址ah,列地址al-----------------------------------
ShowStr:
push cx ;保存环境
push di
push ax
mov di,dx ;将列地址传入di
and di,00FFh ;取低位列地址
mov al,80
mul dh
add di,ax
add di,di
ShowStrBG: mov ch,0
mov cl,ds:[si]
jcxz ShowStrOK ;判断是否为结束符\0
mov es:[di],cl
inc di
mov es:[di],0ACh
inc si
inc di
jmp ShowStrBG
ShowStrOK: pop ax
pop di
pop cx ;恢复环境
ret
code ends
end start | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-01-19 17:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53 |
|
|
|
|
|
[第6楼]
[ 回复时间:2010-01-20 14:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53 |
关于这里有一点不解
mov dx,0
dtoc_s:mov cx,10
call divdw
jcxz dtoc_ok 调用第二个子程序真是很好啊,这样可以避免溢出,只是当调用时,余数是保存cx中的,当商为0时,可jcxz判断的是cx啊,就变成判断余数是否为0了,不太对啊 add cx,30H
push cx
inc si
jmp short dtoc_s | | |
|