当前位置: 代码迷 >> 汇编语言 >> linux 下汇编有关问题,高人指教!
  详细解决方案

linux 下汇编有关问题,高人指教!

热度:8588   发布时间:2013-02-26 00:00:00.0
linux 下汇编问题,高人指教!!!!!
1.   在linux下是不是不能像8086汇编那样改变cs的值,mov   ax,0ah         mov   cs,ax               这样是不是不行的?

2.如果程序使用实地址模式,那么所有段寄存器都指向零线性地址,并且不会被程序改动。所有指令码、数据元素和堆栈元素都是通过他们的线性地址直接访问的。-------这句话是不是错了,还是我没理解。好像8086汇编下不是这样啊,也没直接指向零线性地址啊?

3.   globl这个东西是做什么的,没看明白书上的解释?



------解决方案--------------------------------------------------------
1. 当然可以,但是要ring0权限才行。
2. 这应该是说flat模式,不分段,也就是只有一个段。
3. 确实不知道globl是什么。也许global?这个词的意思是全局的、全球的等等,没有上下文很难说是什么意思。

------解决方案--------------------------------------------------------
似乎x86没这条指令,改CS只能用 jmp 或 call

global 导出符号,连接时能被其它模块看到
------解决方案--------------------------------------------------------
mov ax,cs;mov cs,ax都有啊。

------解决方案--------------------------------------------------------
mov 到CS是不允许的,只能mov ax,cs
见intel开发者文档第二卷对MOV指令的解释

global 导出符号,连接时能被其它模块看到
比如你的工程有A.ASM B.ASM两个文件
B.ASM可以使用A.ASM中的global符号

.globl _start比较特殊,相当于声明这是整个程序的起点。--当然这也取决于你的链接器和连接脚本,不过暂时还不用学这么多。
------解决方案--------------------------------------------------------
mov cs,ax 指令是存在的,只是会导致异常而已,
而且nec v20确实可以执行mov cs,ax,这也是区分8086和v20的一个方法。

------解决方案--------------------------------------------------------
怎么做?
你不是都看了“intel开发者文档第二卷”吗?:)
你的看法是在实模式和保护模式下试出来的吧。
intel的书上虽然写了会引发无效操作码异常,
不过它并没有写在8086/8088上根本没有无效操作码异常,
在8086/8088上不识别的指令是作为NOP执行的,
通常这样执行会导致指令序列错乱,程序跑飞了。
一般会死机,但不是必然如此。