|
主题 : : 设置SS后,CS、IP、AX内容全被修改了,求原因。 [待解决] |
回复[ 9次 ]
点击[ 376次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-06-22 10:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-10 14:32 |
;-----------------------------说明------------------------------
;本程序用来在DOS页面下的12、13、14行,分别
;显示三个不同颜色的welcome to masm!字符串
;本人调试系统为XP系统,工具为masm5.0
;----------------------------------------------------------------
assume cs:code
data segment
db 'welcome to masm!'
db 2,36,113 ;背景颜色
data ends
code segment
start:
mov ax,data
mov ds,ax
mov cx,3
mov ax,0
mov bp,ax
mov ax,1
mov si,ax ;用来控制背景
s:mov di,cx
mov cx,16
mov bx,0
mov dh,[bx+si+15]
mov ax,0B863H
add ax,bp
mov ss,ax ;!!!!问题出在这一行,我设置了SS后,便出问题,导致跳出我的程序
mov ax,0
mov sp,ax
mov bx,15
s0:mov dl,[bx]
push dx
dec bx
loop s0
inc si
add bp,0AH
mov cx,di
loop s
mov ax,4c00h
int 21
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-06-22 10:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20 |
说难听点,一塌糊涂。。。
中途一般不会修改ss,ss一般只在程序初始化的时候定义。
而且你还是在循环里面不停的改。
ss是栈段地址,固定不会变,还有sp一般也不会变。只会让CPU更改。
如果你想不停的变,就用bp
ss:bp来定位你要的地址。
[bp] 不写段名默认为ss段。
建议:重写吧。 现在看你把sp ss bp弄成一堆乱得不成体统。 你用push pop都不知道你的值都被弄哪去了。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-06-22 10:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20 |
|
|
|
|
|
[第3楼]
[ 回复时间:2011-06-22 15:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-10 14:32 |
说难听点,一塌糊涂。。。
中途一般不会修改ss,ss一般只在程序初始化的时候定义。
而且你还是在循环里面不停的改。
ss是栈段地址,固定不会变,还有sp一般也不会变。只会让CPU更改。
如果你想不停的变,就用bp
ss:bp来定位你要的地址。
[bp] 不写段名默认为ss段。
建议:重写吧。 现在看你把sp ss bp弄成一堆乱得不成体统。 你用push pop都不知道你的值都被弄哪去了。
------------------
回复:呵呵,谢谢,我刚开始学,我想请教一个问题:在代码段中,不可以自己建一个栈,并操作它吗? | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-06-22 15:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-10 14:32 |
另一个建议:把栈那章重看一遍。
------------------
回复:
你好,栈这一章我重新看了一遍,没有提到栈需要在程序初始化的时候建立,同时,我在里面的代码中,有通过设置SS和SP来把一块内存地址当做栈来操作的。
不过,我大概想到我的问题出在什么地方了,好像是我把屏幕显示的内存区域当成“栈”来操作,而导致这类错误发生。我只是把“栈”的操作当成自定义内存的一块区域以“栈”特殊的方法来操作了。下面是我新写的程序,不用“栈”来操作。但直接运行exe的时候出错,但在debug调试时,直接执行到mov ax,4c00h时,能正常显示。麻烦帮我看一下错误原因,谢谢。
下面一段上代码。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-06-22 15:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-10 14:32 |
回复:[贴 主]
------------------
assume cs:code, ds:data
code segment
start:
mov ax,data ;设置数据寄存器
mov ds,ax
mov cx,3
mov ax,0
mov bp,ax
mov ax,1
mov si,ax ;用来控制背景
s:mov ds:[20h],cx
mov cx,16
mov bx,0
mov ax,bp
add ax,0B863H
mov es,ax
mov ds:[22h],bp
mov dh,[bx+si+15]
mov bx,0
mov ax,0
mov bp,ax
s0:mov dl,[bx]
mov es:[bp+40h],dx
inc bx
add bp,2
loop s0
inc si
mov bp,ds:[22h]
add bp,0AH
mov cx,ds:[20h]
loop s
mov ax,4c00h
int 21
code ends
data segment
db 'welcome to masm!'
db 2,36,113,0,0,0,0,0,0,0,0,0,0,0,0,0 ;背景颜色
; db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 8 dup(0)
data ends
end start | | |
|
|
|
|
[第6楼]
[ 回复时间:2011-06-22 15:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-10 14:32 |
|
|
|
|
|
[第7楼]
[ 回复时间:2011-06-22 15:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-10 14:32 |
失误,失误,今天给同事调程序来,
int 21
应该是
int 21h | | |
|
|
|
|
[第8楼]
[ 回复时间:2011-06-22 15:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20 |
|
|
|
|
|
[第9楼]
[ 回复时间:2012-08-30 15:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-13 17:41 |
别用ss:sp,最好用ds:bx,它们是专门给数据段设计的。 | | |
|