当前位置: 代码迷 >> 汇编语言 >> 有段代码很奇怪如次
  详细解决方案

有段代码很奇怪如次

热度:244   发布时间:2016-05-02 04:36:51.0
有段代码很奇怪如下
每一次执行 pop cs:[bx] 这段代码,栈都自己改变了,我看书上讲当执行pop只是弹出然后 修改sp=sp+2  对其原先位置值并不会自动更改,比如弹出33只是简单把sp指到44这个位置,33这个值并不会被改掉,但我debug时去发现代码把33写到123h位置后,原先33这个值被改掉,后面44也是这样,奇怪是代码里并没有mov 和push,请问下这是怎么回事


assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 33,44,55,66,77,88,99,22                                                  ;把33到22这段当栈
  start:
mov ax,cs
mov ss,ax
mov sp,16                               ;初始指到33这个位置
mov cx,8
mov bx,0

s:
pop cs:[bx]                                  ;把33到22这些数字依次改写0123h到0987h里
add bx,2
loop s
mov ax,4ch
int 21h
code ends

end start
------解决方案--------------------
引用:
这些变化是操作系统干的
是的,其实在你写的程序被加载入内存时它就为操作系统提供了用于重定位的信息这也是你为什么在编写程序的时候需要使用assume语句,使用start和end start  XXXsegment   XXXends 的原因这些语法限制就是为了在编译器在编译的时候可以生成有关程序位置的信息以便于操作系统加载它的时候可以重定位,而对于操作系统而言内存管理是最基本的职能它要负责为加载的程序分配内存也要负责把不用的内存回收回来以供别的程序使用,dos怎么管理的内存的我也不知道但是你在栈中出栈后的数据被覆盖就是操作系统做的,你想啊你在debug的时候内存里面就你的程序还有操作系统,你没有动那就是操作系统回收回去给别的程序或者自己用了,如果你在裸机环境下或者上虚拟机其实一个汇编程序是不需要如同masm语法那么复杂的,masm依赖于windows,你自然只能按照windows的标准来写程序,像nasm就可以不用那些繁琐的东西直接一句汇编语句都可以编译通过,但是运行的时候由于没有操作系统来加载它你需要自己写一个加载程序或者将你写的程序写入主引导扇区。这两者各有利弊吧,楼主学的应该是王爽的汇编语言这书入门还是很不错的,你现在就能看到这些问题很好了,理解不了也没事,随着学习的深入你就知道自己该看什么书了不用别人教的,这些问题你也就慢慢明白了,不用纠结这些现在调试程序看到这些问题只要你得到自己编写程序预想的结果那你的程序就是没有问题的。
------解决方案--------------------
你是使用DEBUG来调试的吧,那就不奇怪了.
因为DEBUG也需要保存调试信息啊.
DOS不是多任务的,也没有开分页,只能保存在现在的进程了
  相关解决方案