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

green__hand 2007-08-13 10:11:25
1. 在linux下是不是不能像8086汇编那样改变cs的值,mov ax,0ah mov cs,ax 这样是不是不行的?

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

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

...全文
364 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
swordsman 2011-06-19
  • 打赏
  • 举报
回复
汇编对我来说太难了。真真的难。!
  • 打赏
  • 举报
回复
怎么做?
你不是都看了“intel开发者文档第二卷”吗?:)
你的看法是在实模式和保护模式下试出来的吧。
intel的书上虽然写了会引发无效操作码异常,
不过它并没有写在8086/8088上根本没有无效操作码异常,
在8086/8088上不识别的指令是作为NOP执行的,
通常这样执行会导致指令序列错乱,程序跑飞了。
一般会死机,但不是必然如此。
dxcnjupt 2007-08-20
  • 打赏
  • 举报
回复
嗯,换成8EC8确实可以反编译
---------------------------------
不过我认为是反编译器没有对特殊的“操作码+操作数”组合进行处理。
因为正向的编译器不能编译mov cs,ax这个指令的--或者说只有nasm不能编,其它汇编器可以,我没试过。


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

我的看法是1直接死机;2进入06号异常
  • 打赏
  • 举报
回复
是8E C8。
mov cs,ax在8086的设计之初就存在了,后来intel由于某种原因禁用了它。
估计是想限制段间转移吧。
但是指令是存在的,连最老的debug都能识别。
dxcnjupt 2007-08-19
  • 打赏
  • 举报
回复
nec的问题算我弄错了,但是你要说x86上面有这个指令,我可不能接受

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

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

你说E8 C8可以进行MOV到CS的操作
那么
1,它能执行吗,如果能执行,为什么文档说不允许??
2,如果不能执行,你说它会产生异常,那么是什么异常呢??
dxcnjupt 2007-08-19
  • 打赏
  • 举报
回复
那你给我解释一下
为什么用nasm不能编译,报错说“非法指令”

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

明天装个masm也试一下
dxcnjupt 2007-08-17
  • 打赏
  • 举报
回复
我们说的是IA体系又不是v20。明天我们公司也做个CPU,给通用寄存器取名叫CS,那不就....

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

或者你找个nasm试一下,看看你的mov cs,ax能不能编译通过
  • 打赏
  • 举报
回复
NEC 的V20/V30/V40都是x86兼容处理器,不是什么你们公司做的通用处理器叫CS的东西。
mov cs,ax 的码是8e c8,从8086开始就一直存在。
intel文档上是说了不能mov cs,ax,但是并没有说指令不存在。:)
  • 打赏
  • 举报
回复
mov cs,ax 指令是存在的,只是会导致异常而已,
而且nec v20确实可以执行mov cs,ax,这也是区分8086和v20的一个方法。
dxcnjupt 2007-08-16
  • 打赏
  • 举报
回复
mov 到CS是不允许的,只能mov ax,cs
见intel开发者文档第二卷对MOV指令的解释

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

.globl _start比较特殊,相当于声明这是整个程序的起点。--当然这也取决于你的链接器和连接脚本,不过暂时还不用学这么多。
green__hand 2007-08-16
  • 打赏
  • 举报
回复
global 导出符号,连接时能被其它模块看到-------------------------------------------------------链接时能被其他模块看到是什么意思?有什么作用?能不能解释的详细点?
green__hand 2007-08-15
  • 打赏
  • 举报
回复
# 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作用,谢谢!!
  • 打赏
  • 举报
回复
这个就类似MASM/TASM/NASM中的public xxx指示。
david2083() 前面已经说了。
  • 打赏
  • 举报
回复
mov ax,cs;mov cs,ax都有啊。
david2083 2007-08-13
  • 打赏
  • 举报
回复
似乎x86没这条指令,改CS只能用 jmp 或 call

global 导出符号,连接时能被其它模块看到
  • 打赏
  • 举报
回复
1. 当然可以,但是要ring0权限才行。
2. 这应该是说flat模式,不分段,也就是只有一个段。
3. 确实不知道globl是什么。也许global?这个词的意思是全局的、全球的等等,没有上下文很难说是什么意思。

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧