注册 登录
编程论坛 汇编论坛

在16位的DOS汇编中,数据段可以执行吗?

ONEPROBLEM 发布于 2008-10-07 09:27, 3190 次点击
突然想起一个问题,希望有所了解的朋友都来说说自己的看法.
在16位的DOS汇编中,可以实现程序的任意跳转,当CS IP指向了某个数据段,程序还能继续执行下去吗?
15 回复
#2
summerxi2008-10-07 11:20
可以
#3
ONEPROBLEM2008-10-07 12:20
[bo][un]summerxi[/un] 在 2008-10-7 11:20 的发言:[/bo]

可以

如果可以,那程序最后还能正确返回么?
#4
qingjx2008-10-07 17:59
学习了
#5
你们都要疼我哦2008-10-07 18:10
好象不行吧.
#6
维天2008-10-07 19:32
不行啊,CS.IP执行的是代码段啊,不是数据段,很可能会死机(猜测),数据是拿来用的,不是执行的!只有有代码才能知道数据所在或读取!
#7
netsolo2008-10-07 20:34
DOS没那么严格,怎么搞还不是看程序员自己了
#8
ONEPROBLEM2008-10-07 23:11
回复 6# 维天 的帖子
我也有这想法,比较赞同维天~~
虽然说在DOS下,我们想怎么安排都可以,但毕竟是数据段,把它当作代码段来执行,很可能它会"乱来",结果就是程序没能正确返回.
#9
rediums2008-10-07 23:44
可以先写一段代码,编译成二进制格式,然后存入数据段,这样在CS:IP指向那里的时候就不会有错了
#10
ONEPROBLEM2008-10-07 23:50
[bo][un]rediums[/un] 在 2008-10-7 23:44 的发言:[/bo]

可以先写一段代码,编译成二进制格式,然后存入数据段,这样在CS:IP指向那里的时候就不会有错了

呵呵~~从编程者的角度来看,它应该是代码段了,只不过是放到了另一个地方而已.
#11
rediums2008-10-07 23:56
为了程序能够正确执行,只能这样了。
#12
toyix2008-10-08 06:53
assume cs:code,ds:data,ss:stack
data segment
    a db 8Bh,0C3h,0B8h,00h,4Ch,0CDh,21h
data ends
stack segment
    b db 8Bh,0C3h,0B8h,00h,4Ch,0CDh,21h
stack ends
code segment
 start:mov ax,1111h
       mov bx,2222h
   
      ;jmp far ptr a
     jmp far ptr b
      
     
code ends
end start     这样可以吗
#13
ONEPROBLEM2008-10-08 07:19
应该可以了.
8BC3          mov ax,bx
B8004C        mov ax,4C00
CD21          int 21
可是这个数据段,其实是可以正常执行下去的代码段.最后,程序竟然在数据段里安全地退出了.假如jmp far ptr b 后面还有其它指令呢?结果可能是:数据段变成了子程序.
#14
蓝色神话2008-10-08 10:26
CPU只认机器指令,不管你这个指令放在哪。CPU只是从PC寄存器指向的地方取指令然后执行!
#15
zklhp2008-10-08 12:49
[bo][un]蓝色神话[/un] 在 2008-10-8 10:26 的发言:[/bo]

CPU只认机器指令,不管你这个指令放在哪。CPU只是从PC寄存器指向的地方取指令然后执行!


9494 dos里没那么多限制 只要指令有效 就行
#16
darkdsn2012-11-27 22:20
数据和代码本没有区别,只不过存放的地方不一样,当两者重合时就会产生边界问题.如果把重合处的代码属性改为可执行,再把指令指针指向那里,就可以执行了.
1