|
发表于 2012-3-20 21:59:04
|
显示全部楼层
本帖最后由 wAterLoo 于 2012-3-23 22:15 编辑
你写CALL 应该遵守一个原则,call里面的如果使用了某些寄存器,那么你应该在函数的开始把他们push进去,然后call结束的时候在把他们按着逆序pop回来 你的代码逻辑有点乱,而且是半成品,我不好做猜测
楼主可参考
- ;应用举例:将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
- ;在显示时调用子程序show_str。
- assume cs:code,ds:data
- data
- segment
- db 10 dup (0)
- data ends
- code
- segment
- start: mov
- ax,12666
- mov bx,data
- mov ds,bx
- mov si,0 ;ds:si指向data首地址
- call dtoc1
-
- mov dh,8
- mov dl,3
- mov cl,2
- call show_str
-
- mov ax,4c00h
- int 21h
-
- ;名称:dtoc1
- ;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
- ;参数:(ax)=word型数据;
- ; ds:si指向字符串首地址。
- ;返回:无。
- dtoc1: push
- ax
- push bx
- push cx
- push dx
- push si
- push di
- mov di,0
- d10: mov dx,0
- ;设置被除数高位为0
- mov bx,10
- ;除数为10
- div bx
- add dx,30h ;ax/10的余数+30h,转为字符
- push dx ;字符入栈
- inc di
- ;记录字符个数
- mov cx,ax
- jcxz d11
- ;当ax/10的商=0时,转到d11执行
- jmp d10
- d11: mov cx,di
- d12: pop dx
- ;字符出栈
- mov [si],dl
- inc si ;ds:si指向下一单元
- loop
- d12
- mov dl,0
- mov [si],dl ;设置结尾符0
- pop si
- pop di
- pop dx
- pop cx
- pop bx
- pop
- ax
- ret
-
- ;名称:show_str
- ;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
- ;参数:(dh)=行号(取值范围0~24);
- ; (dl)=列号(取值范围0~79);
- ; (cl)=颜色;
- ; ds:si指向字符串的首地址。
- ;返回:无。
- show_str:
- push
- ax
- push bx
- mov ax,0b800h
- mov es,ax
- mov ax,160
- mul dh
- mov bx,ax ;bx=160*dh
- mov ax,2
- mul dl
- ;ax=dl*2
- add bx,ax ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址
- mov al,cl ;把颜色cl赋值al
- mov cl,0
- show0:
- mov ch,[si]
- jcxz show1 ;(ds:si)=0时,转到show1执行
- mov es:[bx],ch
- mov es:[bx].1,al
- inc si ;ds:si指向下一个字符地址
- add bx,2 ;es:bx指向下一个显存地址
- jmp show0
- show1:
- pop bx
- pop
- ax
- ret
-
- code
- ends
- end
- start
复制代码
|
|