ARM汇编中.word含义的深度剖析(uboot源码)
时间:2010-05-14 来源:cumtfedora
原文地址:http://hi.baidu.com/aokikyon/blog/item /c632910faa1eb1e7aa6457e9.html
汇编中.word的具体用途是什么?
不好意思,在嵌入式版发了一次,因为没人回,所以转到这儿了,请大家谅解。
比如说u-boot中的start.S中的:
ldr pc, _undefined_instruction
_undefined_instruction: .word undefined_instruction
这个.word的用途是什么。我知道它是伪指令,也看过GNU ASM和as.info。
不妨copy下来:
.word
Syntax: .word expressions
This directive expects zero or more expressions, of any section, separated by commas. For each expression, as emits a 16-bit number for this target.
它说对每一个表达式,会根据平台产生一个XXbit的数字。这是什么意思?
请大家帮我解答这个疑惑。
我调试时看到这句对应的反汇编是:
mvnccs r0,#0x10 ;
这么一来我又更糊涂了。
可能没说明白我的问题,我再说一下我的问题:
结合
_undefined_instruction: .word undefined_instruction
,这.word在这儿有什么作用? .word后面跟的参数有什么要求? 前面标个行号,pc跳转到这儿的时候,是不是又接着跳转到undefined_instruction这个子程序中去了?
谢谢大家。
Re: 汇编中.word的具体用途是什么?
_undefined_instruction: .word undefined_instruction
_undefined_instruction是一个标号,处理到这里时,as会把 undefined_instruction的值按16bit的 形式放在此标号处。
ldr pc, _undefined_instruction
就是从_undefined_instruction处取值,即undefined_instruction,
并设置到pc中
Re: 汇编中.word的具体用途是什么?
多谢你的回答。
能不能再告诉我.word的用法和具体用途?
.word 作用是什么?取 undefined_instruction 的地址值给标号么?
还有类似的指令:
.word 0 那又是什么意思?
那么这个代码可以不用.word啊。
直接:
ldr pc, undefined_instruction 跳转到那个子程序不就可以了?
Re: 汇编中.word的具体用途是什么?
.word就是在这个地方放一个值。相当于在这里定义一个数据变量。
我不熟悉ldr的具体含义。但我想
ldr pc, undefined_instruction
是不是一个间接寻址的指令?
用undefined_instruction就是把地址为 undefined_instruction处的值取出来给pc?
显然undefined_instruction处的值和undefined_instruction本身是不同的。
而用_undefined_instruction则是取地址为 _undefined_instruction处的值,
由于在地址为_undefined_instruction的地方用.word定义了一个16bit的数据,
并将underfined_instruction的值本身放在这里,因此,pc=undefined_instruction,实现跳转。
Re: 汇编中.word的具体用途是什么?
ldr 是把数据从存储器传输到寄存器上,格式如下:
ldr(条件) 目的寄存器,<存储器地址>
这样看来,我好像想明白了一些。谢谢wheelz的耐心帮助与解答。
ldr r1, _rWTCON
_rWTCON:
.word 0x15300000
这两个语句是不是说把地址0x1530 0000 上的内容传递到r1? 而不是把0x1530 0000 放到r1 ?
.word和0x1530 0000有什么关系?.word就是把expression上的值取出来? expression代表地址?
不好意思,真是给.word弄晕了.(PS:作者的理解错了,下面的回答是正解!!!)
Re: 汇编中.word的具体用途是什么?
老大,我真是服了你了,呵呵。
ldr r1, _rWTCON
_rWTCON:
.word 0x15300000
这两个语句是不是说把地址0x1530 0000 上的内容传递到r1? 而不是把0x1530 0000 放到r1 ?
不是把地址0x1530 0000 上的内容传递到r1,是把地址_rWTCON上的内容放到r1,而地址_rWTCON上的内容是0x15300000。实际上就是把r1设 置为 0x15300000
------------------------------------------
.word和0x1530 0000有什么关系?.word就是把expression上的值取出来? expression代表地址?
.word expression就是在当前位置放一个word型的值,这个值就是expression
举例来说,
_rWTCON:
.word 0x15300000
就是在当前地址,即_rWTCON处放一个值0x15300000
翻译成intel的汇编语句就是:
_rWTCON dw 0x15300000
Re: 汇编中.word的具体用途是什么?
undefined_instruction的值按16bit的形式放在此标号处。
实际上就是把r1设置为0x15300000
?0x15300000 ?16bit?
Re: 汇编中.word的具体用途是什么?
严重感谢wheelz君。
这下我可弄明白了,最后问个问题: 请你吃个饭,好不?
谢谢wheelz!!!
Re: 汇编中.word的具体用途是什么?
>>>>>>>>>>
undefined_instruction的值按16bit的形式放在此标号处。
实际上就是把r1设置为0x15300000
?0x15300000 ?16bit?
>>>>>>>>>
这倒是一个问题,怎么会是double word?
Re: 汇编中.word的具体用途是什么?
>这下我可弄明白了,最后问个问题: 请你吃个饭,好不?
好说,好说,呵呵。
Re: 汇编中.word的具体用途是什么?
>>>>>>>>>>
undefined_instruction的值按16bit的形式放在此标号处。
实际上就是把r1设置为0x15300000
?0x15300000 ?16bit?
>>>>>>>>>
这倒是一个问题,怎么会是double word?
=================
ARM的WORD跟386不同,是32bit的。(注意:上面的.word在ARM中是 4Bytes=32bits,也就是32位的!)
Re: 汇编中.word的具体用途是什么?
看了你的解释,受益匪浅。
不过还是有个小问题。
ldr r1, _rWTCON
//
_rWTCON: .word 0x15300000
/////////////////////////////////////////////////////
ldr pc, _undefined_instruction
//
_undefined_instruction: .word undefined_instruction
在arm7,9中(其他的我不清楚)arm指令集中一个字类型就是32位。
在另一个bootloader VIVI中也有类似的情况,不过它使用的.long
就像这样
ldr pc, _undefined_instruction
//
_undefined_instruction: .long undefined_instruction
我理解指令的大概意思,就是不懂为什么要搞个.long或.word
是不是如果采用下面的形式是无法实现的
ldr pc, _undefined_instruction
//
_undefined_instruction: undefined_instruction
因为_undefined_instruction: undefined_instruction 中间没有操作指令。指令根本无法实现。???
如果和C语言比较是不是类似这样:
void test(void);
goto L1;
//
L1:(int)test();//什么东东啊?我可从来没这种代码啊!!!
///////////////////////////
#define AA 6;
goto L1;
//
L1:test();
///////////////////////////
Re: 汇编中.word的具体用途是什么?
_undefined_instruction: .long undefined_instruction
这其实是在定义一个数据!
_undefined_instruction: undefined_instruction (PS:这里undefined_instruction可能是一个函数,请看下面的解释!)
不符合汇编的语法?
没有.long/.word
汇编程序就不知道你想在这里放一个多大的数据,
相当于数据类型。
没有数据类型,你怎么定义数据变量?
Re: 汇编中.word的具体用途是什么?
ldr pc, _undefined_instruction
//
_undefined_instruction: .long undefined_instruction
可是undefined_instruction 是指的一个函数 (PS: 对照上面的看)
(处理非定义指令异常,可能是处理协处理器指令的)起始地址,
相当于把undefined_instruction 函数的开始地址赋给pc,使程序调转到该函数。
///////////////////////////////////
汇编程序就不知道你想在这里放一个多大的数据,
////////////////////////////
汇编程序难道不知道一个函数的开始地址是一个多大的数据和数据类型?编译器没这么水吧?
Re: 汇编中.word的具体用途是什么?
hehe,我觉得汇编器的确这么水。C编译器会智能一些
汇编器应该不知道什么是函数,也就不知道函数指针应该有多大。
这里就是想在代码段的这个地方加入一条未定义指令,一般的程序都是这么写的。
Re: 汇编中.word的具体用途是什么?
那这种汇编语言是什么汇编语言?
怎么和ARM教材上的汇编语言的语法不一样啊?
请问您有具体的资料可以共享一下吗?
非常感谢
Re: 汇编中.word的具体用途是什么?
>hehe,我觉得汇编器的确这么水。C编译器会智能一些
>汇编器应该不知道什么是函数,也就不知道函数指针应该有多大。
到执行的机器码时,机器是不知道什么是函数。汇编器也不知道?不敢苟同。(PS:哈哈)
>这里就是想在代码段的这个地方加入一条未定义指令(?),一般的程序都是这么写的。
可是undefined_instruction 是指的一个函数(处理非定义指令异常,
也可能是处理协处理器指令的)。
ldr pc, _undefined_instruction
这个很多教材上都有吧?
_undefined_instruction: .long undefined_instruction
这个也有,只是没有说明.long干嘛的。
可能是一个无聊的问题。是不是就像数学上1+1?=2一样。