是书上的一道练习题,写一个子程序,用来显示字符串,然后用主程序测试
话说LZ初学汇编,刚写完代码,一看行数就知道多半要杯具,调试之后,LZ不禁感叹,自己真是神机妙算啊
- Assembly code
assume cs:code,ds:datadata segment db 'abcdefg123',0 db 8 dup (0)data endscode segment ;主程序 ;设置参数,调用子程序show_str main: mov ax,data mov ds,ax mov si,0 mov ss,ax mov sp,19 mov cl,10001111b call show_str mov ax,4c00h int 21h ;子程序 show_str ;功能 显示指定字符串 ;参数 dh=行号,dl列号,cl前背景色/闪烁/高亮,ds:si字符串首地址 ;返回 无 show_str: ;寄存器现场保护 push ax push bp push es ;正文 mov al,160 mul dh mov bp,ax mov al,2 mul dl add bp,ax mov ax,0b800H mov es,ax mov di,0 mov ch,0 mov ah,cl s: mov cl,[si] jcxz s1 mov al,[si] mov es:[bp+di],al mov es:[bp+di+1],ah inc si add di,2 jmp s ;返回 s1: pop es pop bp pop ax retcode endsend main
------解决方案--------------------------------------------------------
1. call 之前设置下 dx
2. sp 设置为 19 ?dos16 模式下,sp 要对齐到 word 的
3. 这样的程序,在纯 dos 下会有更好、可靠的效果,至少也是全屏模式吧
------解决方案--------------------------------------------------------
在程序倒数第三行加上,mov al,0
int 16h
这两行就ok了