您的位置:程序门 -> 其他开发语言 -> 汇编语言



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


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


linux 下汇编问题,高人指教!!!!![已结贴,结贴人:green__hand]
发表于:2007-08-13 10:11:25 楼主
1.   在linux下是不是不能像8086汇编那样改变cs的值,mov   ax,0ah         mov   cs,ax               这样是不是不行的?

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

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

发表于:2007-08-13 16:20:121楼 得分:5
1.   当然可以,但是要ring0权限才行。
2.   这应该是说flat模式,不分段,也就是只有一个段。
3.   确实不知道globl是什么。也许global?这个词的意思是全局的、全球的等等,没有上下文很难说是什么意思。
发表于:2007-08-13 16:28:282楼 得分:2
似乎x86没这条指令,改cs只能用   jmp   或   call

global   导出符号,连接时能被其它模块看到
发表于:2007-08-13 17:15:453楼 得分:3
mov   ax,cs;mov   cs,ax都有啊。
发表于:2007-08-15 10:01:464楼 得分:0
#   cstest.s   -   an   example   of   the   cs   register
.section   .data
data:
.short   15
.section   .text
.globl   _start
_start:
movw   $data,   cs
movl   $10,   %ebx
int   $0x80


globl例,高人指点。globl作用,谢谢!!
发表于:2007-08-15 14:48:065楼 得分:0
这个就类似masm/tasm/nasm中的public   xxx指示。
david2083()   前面已经说了。
发表于:2007-08-16 08:19:246楼 得分:0
global   导出符号,连接时能被其它模块看到-------------------------------------------------------链接时能被其他模块看到是什么意思?有什么作用?能不能解释的详细点?
发表于:2007-08-16 10:13:047楼 得分:3
mov   到cs是不允许的,只能mov   ax,cs
见intel开发者文档第二卷对mov指令的解释

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

.globl   _start比较特殊,相当于声明这是整个程序的起点。--当然这也取决于你的链接器和连接脚本,不过暂时还不用学这么多。
发表于:2007-08-16 11:34:218楼 得分:2
mov   cs,ax   指令是存在的,只是会导致异常而已,
而且nec   v20确实可以执行mov   cs,ax,这也是区分8086和v20的一个方法。
发表于:2007-08-17 09:19:249楼 得分:0
我们说的是ia体系又不是v20。明天我们公司也做个cpu,给通用寄存器取名叫cs,那不就....

intel开发者文档第二卷写的很清楚,mov到cs是不允许的
而且也没有对应这个指令的机器码
没机器码,你要它怎么存在

或者你找个nasm试一下,看看你的mov   cs,ax能不能编译通过
发表于:2007-08-17 16:03:4310楼 得分:0
nec   的v20/v30/v40都是x86兼容处理器,不是什么你们公司做的通用处理器叫cs的东西。
mov   cs,ax   的码是8e   c8,从8086开始就一直存在。
intel文档上是说了不能mov   cs,ax,但是并没有说指令不存在。:)
发表于:2007-08-19 20:40:2511楼 得分:0
那你给我解释一下
为什么用nasm不能编译,报错说“非法指令”

是不是nasm做的太烂了,有漏洞

明天装个masm也试一下
发表于:2007-08-19 21:15:4212楼 得分:0
nec的问题算我弄错了,但是你要说x86上面有这个指令,我可不能接受

nec兼容x86   =   x86的指令nec都有,x86没的指令nec也可以做扩展

嗯,还有一个问题
并不是随便把一个操作码和一个操作数组合起来就是合法的代码。关键要看cpu能不能识别。刚才做了个实验,用ndisasm反编译e8c8......你自己试一下吧。

你说e8   c8可以进行mov到cs的操作
那么
1,它能执行吗,如果能执行,为什么文档说不允许??
2,如果不能执行,你说它会产生异常,那么是什么异常呢??
发表于:2007-08-19 22:17:5313楼 得分:0
是8e   c8。
mov   cs,ax在8086的设计之初就存在了,后来intel由于某种原因禁用了它。
估计是想限制段间转移吧。
但是指令是存在的,连最老的debug都能识别。
发表于:2007-08-20 13:58:0214楼 得分:0
嗯,换成8ec8确实可以反编译
---------------------------------
不过我认为是反编译器没有对特殊的“操作码+操作数”组合进行处理。
因为正向的编译器不能编译mov   cs,ax这个指令的--或者说只有nasm不能编,其它汇编器可以,我没试过。


还有一个问题
如果在8086下碰到8ec8,cpu会怎么做???
如果在保护模式下碰到8ec8。cpu又会怎么做???

我的看法是1直接死机;2进入06号异常
发表于:2007-08-20 16:37:5215楼 得分:5
怎么做?
你不是都看了“intel开发者文档第二卷”吗?:)
你的看法是在实模式和保护模式下试出来的吧。
intel的书上虽然写了会引发无效操作码异常,
不过它并没有写在8086/8088上根本没有无效操作码异常,
在8086/8088上不识别的指令是作为nop执行的,
通常这样执行会导致指令序列错乱,程序跑飞了。
一般会死机,但不是必然如此。


快速检索

最新资讯
热门点击