实验10.1 显示字符串子程序 错误查找
实验10.1 显示字符串子程序 自己写的答案 找了好几遍没找出错误.找不出错误在哪里.不能正常显示.请师兄们帮忙看下哪个环节出错.有注释assume cs:code
data segment
db 'welcome to masm!',0
data ends
code segment
start: mov dh,8
mov dl,3
mov cl,2 ;字体颜色
mov ax,data
mov ds,ax
mov si,0 ;字符串索引
call show_str
mov ax,4c00h
int 21H
show_str:mov al,160 ;每一行 160个字节
mul dh ;*8行 计算出行数位置储存在AX中
mov bx,ax ;将 行数位置 赋值给 BX
mov al,2 ;第一列 占2个字节
mul dl ;计算出首列的位置
add bx,ax ;首行位置加上 首列位置.........计算出首字符的显示位置偏移
mov ax,0b800h ;B800 为显存初始位置
mov es,ax ;显存地址段开始位置 ES: 为要显示的初始位置
kscopy:mov ch, ;将字符数据赋值给CH ,CL 为字体颜色没有改变
push cx ;将CX 字符数据,和字体颜色 压入栈
mov cl,0 ;将 CL 赋值为0,CX的数据没有变化 为字符数据
jcxz ok ; 如果 CX的值为0跳出子程序
pop cx ; CX的值不为0恢复CX原先的数据
mov es:,ch ;将 CH的字符数据 赋值给显示的初始位置ES: 低位字节
mov es:,cl ;将 CL的字体颜色数据赋值给 ES: 高位字节存放的是字符属性
inc si ;字符串索引 自增1 字节为1
add di,2 ;显示位置自增2
jmp short kscopy
ok: ret
code ends
end start
我编译没问题啊!不知道你用的是哪个班版本的编译器,我用的是MASM5.0的,之后程序可以运行,但显示不出字符串,我debug之后,单步调试的时候,显示出来了,只不过是单步显示,我想这可能和dos版本或者系统有问题吧!因为我用的是win7系统,你完了之后,用XP系统试一下,或者用dosbox试一下,这都是可以的,以前我在做的时候,就是在XP下的!
assume cs:code
data segment
db 'welcome to masm!',0
data ends
code segment
start: mov dh,8
mov dl,3
mov cl,2 ;字体颜色
mov ax,data
mov ds,ax
mov si,0 ;字符串索引
call show_str
mov ax,4c00h
int 21H
show_str:mov al,160 ;每一行 160个字节
mul dh ;*8行 计算出行数位置储存在AX中
mov bx,ax ;将 行数位置 赋值给 BX
mov al,2 ;第一列 占2个字节
mul dl ;计算出首列的位置
add bx,ax ;首行位置加上 首列位置.........计算出首字符的显示位置偏移
mov ax,0b800h ;B800 为显存初始位置
mov es,ax ;显存地址段开始位置 ES: 为要显示的初始位置
kscopy:mov ch, ;将字符数据赋值给CH ,CL 为字体颜色没有改变
push cx ;将CX 字符数据,和字体颜色 压入栈
mov cl,0 ;将 CL 赋值为0,CX的数据没有变化 为字符数据
jcxz ok ; 如果 CX的值为0跳出子程序
pop cx ; CX的值不为0恢复CX原先的数据
mov es:,ch ;将 CH的字符数据 赋值给显示的初始位置ES: 低位字节
mov es:,cl ;将 CL的字体颜色数据赋值给 ES: 高位字节存放的是字符属性
inc si ;字符串索引 自增1 字节为1
add bx,2 ;显示位置自增2//原先这里也写错了写成 DI
jmp short kscopy
ok: pop cx ;当CX 为0时 直接跳转 并没有执行POP 指令, 此时 栈顶指针指向的是 前面PUSH进去的 CX值,上面没有POP 出来.造成 RET 返回的数据错误..
ret
code ends
end start 本帖最后由 bahaya 于 2014-4-11 13:55 编辑
问题解决了....MASM版本也是有一个问题.然后代码本身也是有问题.漏了一个POP指令.修改过后能正常显示了...谢谢师兄的指引:big
bahaya 发表于 2014-4-11 13:51 static/image/common/back.gif
问题解决了....MASM版本也是有一个问题.然后代码本身也是有问题.漏了一个POP指令.修改过后能正常显示了...谢 ...
呵呵!互相学习嘛! “请教,学习”,公开,望指导
页:
[1]