. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->自由讨论区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  设置SS后,CS、IP、AX内容全被修改了,求原因。  [待解决] 回复[ 9次 ]   点击[ 376次 ]  
aadmwdk
[帖 主]   [ 发表时间: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
rotapple
[第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都不知道你的值都被弄哪去了。
rotapple
[第2楼]   [ 回复时间:2011-06-22 10:55 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20
另一个建议:把栈那章重看一遍。
aadmwdk
[第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都不知道你的值都被弄哪去了。
------------------
回复:呵呵,谢谢,我刚开始学,我想请教一个问题:在代码段中,不可以自己建一个栈,并操作它吗?
aadmwdk
[第4楼]   [ 回复时间:2011-06-22 15:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-10 14:32
另一个建议:把栈那章重看一遍。
------------------
回复:

你好,栈这一章我重新看了一遍,没有提到栈需要在程序初始化的时候建立,同时,我在里面的代码中,有通过设置SS和SP来把一块内存地址当做栈来操作的。

不过,我大概想到我的问题出在什么地方了,好像是我把屏幕显示的内存区域当成“栈”来操作,而导致这类错误发生。我只是把“栈”的操作当成自定义内存的一块区域以“栈”特殊的方法来操作了。下面是我新写的程序,不用“栈”来操作。但直接运行exe的时候出错,但在debug调试时,直接执行到mov ax,4c00h时,能正常显示。麻烦帮我看一下错误原因,谢谢。

下面一段上代码。
aadmwdk
[第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
aadmwdk
[第6楼]   [ 回复时间:2011-06-22 15:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-10 14:32
郁闷,好像我写错了。
aadmwdk
[第7楼]   [ 回复时间:2011-06-22 15:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-10 14:32
失误,失误,今天给同事调程序来,
  int 21 
应该是
  int 21h
rotapple
[第8楼]   [ 回复时间:2011-06-22 15:59 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20
我知道你的想法,就是直接把栈当成要写入的地方。但是这是非常不好的想法。

可以自己建栈。

assume ss:stacksg

stacksg segment stack
db 16 dup(0)
stacksg ends

.....

你的代码我暂时没有时间帮你调试。因为在工作。。
我自己的步骤:
1,一行占160字节,减去要打印的字节(32)除2就是正中开始的偏移。(因为有字节还有颜色所以是32)
2,共3行,屏幕25行,减3除2,为需要占的偏移
所以开始位置为b800:11行*160+((160-打印字长)/2)=720,起始位置为b800:720h
3,将b800保存至es不要改变,bx表示一行的量,di表示当前颜色,si为源字符
4,用双循环完成,外循环3行,内循环16字。

具体代码地址:http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=40812&kindId=57150&postId=52102&readSg=1

但是我建议你先别看,先把原理弄清楚然后可以显示出来后再可以比较一下。
shinefan
[第9楼]   [ 回复时间:2012-08-30 15:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-13 17:41
别用ss:sp,最好用ds:bx,它们是专门给数据段设计的。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved