LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1897|回复: 10

关于ARM汇编到at&t汇编的转换

[复制链接]
发表于 2006-6-27 16:34:01 | 显示全部楼层 |阅读模式
Reset_Handler                           ;Reset Entry Point

[ ROM_AT_ADDRESS_ZERO
|
        LDR        r0, =HandleSwi                ; SWI exception table address
        LDR        r1, =SystemSwiHandler
        STR        r1, [r0]
        swi     0xff                         ;Call SWI Vector
]

.if ROM_AT_ADDRESS_ZERO
.else
        movl $HandleSwi,%r0
        movl $SystemSwiHandler,%r1
        movl %r1, %(r0)
        ???????
.endif

请问我修改的对不对?第四条语句“swi  0xff”该如何翻译呢?

还请各位高手解答一下~~~是在着急的很~~

多谢了先!
发表于 2006-6-28 01:04:41 | 显示全部楼层
有没有搞错啊!兄弟!!!
你怎么会想到将 ARM 的指令转化为了 x86 的指令了?!

通常任何汇编器都不会改变其对目标器件的指令符,和寻址表达形式的,
不同的汇编器,通常是伪指令的差异而已!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-28 09:30:55 | 显示全部楼层
是这样的,我现有的init.s是坐在网上下载的,它是ARM格式的汇编,但是我要在GCC的环境下对它进行汇编(我们的开发环境是GCC,而不是ARM提供的开发环境),所以要将它改成at&t格式。(否则gas根本无法识别其指令啊)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-28 13:58:48 | 显示全部楼层
路过的好心人帮个忙啊~~~~~
回复 支持 反对

使用道具 举报

发表于 2006-6-28 19:49:30 | 显示全部楼层
你还是先学习一下吧!
kernel, u-boot 都有各种 ARM cpu 的 start.S
这是最好的学习途径。
回复 支持 反对

使用道具 举报

发表于 2006-6-29 23:06:50 | 显示全部楼层
AT&T并不是专门针对X86的, 它只是种语法格式

楼主的意思是要把ADS格式转成AT&T格式吧, 这是可以的, 但是具体如何我也不熟, 只在书中看过, 由于没有应用场合, 基本没有印象

我顺便介绍一些概念:
ADS/SDT IDE 是由ARM公司开发的集成开发环境, 使用 CodeWarrior 编译器, 其支持的语法格式一般称为 ADS 格式
另外也可以用 GNU 的通用编译器如 gcc, as, ld 等来进行 ARM 开发, 它们支持的语法格式称为 AT&T 格式. AT&T 并不针对汇编语言的种类, 仅仅是格式

不过它们的不同主要应该体现在宏及伪操作的格式上, 语句本身好像变化并不大(??记不清了). 所以楼主这种转换确实应该是不对的.

像下面这样???

.if ROM_AT_ADDRESS_ZERO
.else
LDR r0, =HandleSwi ; SWI exception table address
LDR r1, =SystemSwiHandler
STR r1, [r0]
swi 0xff ;Call SWI Vector
.endif
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-30 18:40:23 | 显示全部楼层
多谢DoDo的回复,感觉又明白了一层,请看是不是这样?:
ARM汇编和学X86汇编是两种不同的汇编种类(因为硬件体系结构的不同),而针对这两种汇编可以有不同的语法,at&t是一种汇编语法格式,Intel汇编是一种汇编语法格式。可以使用任何一种语法对他们进行开发,相应编译器会将其转化为在相应目标平台上运行的机器指令。

请问一个问题:现在有哪些汇编语法?又有哪些汇编种类呢?(请多列举几个)

另外:
我认为不仅仅是要改动伪指令吧?例如网上对at&t汇编格式的部分介绍如下:
1、在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀;
2、AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在 AT&T 汇编格式中,目标操作数在源操作数的右边。
3、在 AT&T 汇编格式中,用 '$' 前缀表示一个立即操作数;而在 Intel 汇编格式中,立即数的表示不用带任何前缀

如果象楼主那样改动,其不是和上面的介绍截然相反?~

实在是疑惑甚多,如有不对的地方,还请指正~
回复 支持 反对

使用道具 举报

发表于 2006-6-30 21:13:08 | 显示全部楼层
汇编语言基本和CPU平台相对应,因此汇编语言种类非常多

楼主不要又提到“Intel格式”的问题,这一般指的是PC,或者说x86汇编语言的。楼主既然要改ARM上的程序,没有必要管“Intel格式”,因为ARM汇编一般常见的格式似乎只有ADS和GNU两种。我只在书上看过一些这方面的东西,并没有进一步进行学习,所以记得的也只有这些了。昨天回帖时倒是特意翻了一下书,里面提到的主要是伪指令的区别,而且从示例代码来看,也是如此。

当然了,如果我说的不对,这种可能性是极大的。楼主最好还是找一本书仔细读一读,以免被我误导。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-1 16:20:27 | 显示全部楼层
呵,也不是我想提啊,上面的东西是从网上摘录的~~~
虽然仍心存疑惑,不过甚是感激~
改天有点头绪之后,再来回帖。
回复 支持 反对

使用道具 举报

发表于 2006-7-3 19:19:01 | 显示全部楼层
请分清两个概念:汇编器与指令集,不同的CPU对应不同的指令集;不同的汇编器对应不同的语法和伪指令集。

每种汇编器都可以有自己的伪指令集和自己的语法,但实际上,由于事实标准的原因,(所有的CPU厂商会提供指令使用手册,手册中的指令书写样式,实际上就是事实汇编语法,何况CPU厂商肯定会提供自己的汇编器的),现代大多数的汇编器都会在主流的汇编语法Intel型和AT&T型这两类语法中选择一种作为自己的语法(Intel型可能会越来越流行)。

ARM官方提供的汇编器/指令手册中使用的是Intel型语法,GNU的汇编器gas使用的是AT&T型语法。

然而,gas for arm版的开发者,为了避免混乱,实现了完全和ARM官方汇编语法是一致的语法。也就是说,当你使用ARM指令集的指令时,按ARM官方手册的语法书写,用gas for arm编译完全没有问题。主要要注意的是伪指令集。

回到楼主的代码:
LDR是ARM指令,无论Gas for arm汇编器还是ARM官方汇编器都支持该指令,两者书写格式一致,不用修改,(再说,从指令的角度看,用movl来代替LDR是完全错误的,ARM的mov指令不能操作内存区,只能用LDR指令。)下面的SWI也是一样。所以,如果仅仅是对于上述代码而言,完全不需要什么转换了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表