题目是在屏幕中间分辨显示绿色,绿底红色,白底蓝色的字符串“welcome to masm!”先不考虑能不能在屏幕中间输出的问题,编译能通过,但是用debug调试的时候t命令执行到mov ss,ax下一句CS和IP寄存器就会有很大改动,本应该是mov bp,0的,但是却不知道跳到什么地方去执行了,指令根本不对。我试过把CS和IP寄存器用r命令改回来,但是还是一样,用t命令执行下一句就会直接退出debug不知道是什么回事,不知道是不是我代码有问题
- Assembly code
assume cs:codedata segmentdb 'w','e','l','c','o','m','e',' ','t','o',' ','m','a','s','m','!'data endscode segment R:mov ax,data mov ds,ax mov bx,0 mov ax,0b800h mov ss,ax mov bp,0 mov cx,16 s:mov ah,10b mov al,[bx] mov ss:[bp],ax add bp,2 inc bx loop s mov bx,0 mov bp,0a0h mov cx,16 s1:mov ah,100100b mov al,[bx] mov ss:[bp],ax add bp,2 inc bx loop s1 mov bx,0 mov bp,140h mov cx,16 s2:mov ah,1110001b mov al,[bx] mov ss:[bp],ax add bp,2 inc bx loop s2 mov ax,4c00h int 21hcode endsend R
------解决方案--------------------------------------------------------
我调试是debug直接退出了~应该堆栈问题,ss指向0b800,sp为0,入栈第一个的位置是fffe,而字符显存的位置是b8000~bffff,只有8000H大小,fffe显然超了,bffff后面是只读区~
------解决方案--------------------------------------------------------
ss指向0b800,sp为0, 试着设置下sp的值看看结果如何。怎么可以忘设置堆栈大小呢?
------解决方案--------------------------------------------------------
请不要在程序中使用SS寄存器来当做数据段寄存器来使用,请注意SS是堆栈段寄存器,在程序中需要设置堆栈的时候,才能改变SS的值,同时一般也要设置SP的值来设置堆栈栈顶.
堆栈是个重要的内存区域,程序运行期间,有许多数据会被(自动)放到堆栈中.
源程序中,把SS换成ES就可以了.