1.显示字符串
做这个程序,出现了两个比较大的问题。总结如下:
第一,居然忘记设置段地址,直接将字符放到计算好的地址中,这样默认的段地址在ds中,导致屏幕无字符显示。
第二,一开始在ok标号处,直接就是ret指令,这是程序死循环。经过追踪程序,发现显示完字符串,取到0,转ok,这时ip又回到0002执行。这才意识到,执行ret之前,栈顶是刚才存入的cx的值,而不是返回地址(那一串push和pop是最后才加的)。
程序如下:
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:
push ax
push bx
push cx
push dx
push si
push es
dec dh ;行号减一
mov al,0a0h
mul dh ;0a0h*(行号-1)
mov dh,0
dec dl
add dx,dx ;2*(列号-1)
add ax,dx ;0a0h*(行号-1)+2*(列号-1)
mov bx,ax
mov ch,0 ;ch清零,为cx进栈(颜色)做准备
mov ax,0b800h
mov es,ax ;显存段地址
s: push cx ;颜色进栈
mov cl,[si] ;取出一个字符
jcxz ok ;是零则返回
mov es:[bx],cl ;不是零,放显存相应单元
inc bx
pop cx ;取回颜色
mov es:[bx],cl ;存颜色
inc bx
inc si
jmp short s ;修改指针并循环
ok: pop cx ;返回前,将刚才进栈的cx出栈,使栈顶指针指向返回地址
pop es
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50