什么是伪指令?常用的伪指令功能有哪些

新手学堂030

什么是伪指令?常用的伪指令功能有哪些,第1张

用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。

ADRL

伪指令

将相对于程序或相对于寄存器地址载入寄存器中。

ADR

指令相似。ADRL

所加载的地址比

ADR

所加载的地址更宽,因为它可生成两个数据处理指令。

Note

汇编版本老于

ARMv6T2

的处理器的

Thumb

指令时,ADRL

是无效的。

语法

ADRL{cond}

Rd,label

其中:

cond

是一个可选的条件代码(请参阅条件执行)。

Rd

是要加载的寄存器。

label

表达式,与程序或寄存器相关。

有关详细信息,请参阅相对寄存器和程序相对的表达式。

用法

ADRL

始终汇编为两个

32

位指令。

即使使用单个指令就可完成地址访问,也会生成多余的第二个地址。

如果汇编程序无法将地址构建为两个指令,则它将生成一条错误消息,汇编将失败。

有关加载更宽范围地址的信息,请参阅LDR

伪指令(另请参阅将常数加载到寄存器)。

ADRL

可生成与位置无关的代码,因为地址与程序或寄存器有关。

如果

label

与程序有关,则其表示的地址必须要与

ADRL

伪指令在同一汇编程序区域内,请参阅AREA。

如果使用

ADRL

来为

BX

BLX

指令生成目标,则当目标中包含

Thumb

指令时,您就要自己设置地址的

Thumb

位(位

0)。

体系结构和范围

可用范围取决于所用的指令集:

ARM

±64KB

到字节或半字对齐的地址。

±256KB

字节,字对齐地址。

32

Thumb

±1MB

字节,字节、半字或字对齐地址。

16

Thumb

ADRL

不可用。

上面给出的范围是相对于位于当前指令后的、离当前指令有四个字节(在

Thumb

代码中)或两个字(在

ARM

代码中)间隔的点而言的。

ARM

32

Thumb

中,如果地址为

16

字节对齐,或与该点的相对性更高,则相对地址的范围可更大。

MOV32

伪指令

将以下项之一加载到寄存器:

一个

32

位常数值

任何地址。

MOV32

始终会生成两个

32

位指令,即一个

MOV、MOVT

对。

您可利用它加载任何

32

位常数或访问整个地址空间。

如果用

MOV32

加载地址,则所生成的代码将与位置有关。

语法

MOV32{cond}

Rd,

expr

其中:

cond

是一个可选的条件代码(请参阅条件执行)。

Rd

是要加载数据的寄存器。Rd

不可为

sp

pc。

expr

可以是下列项之一:

symbol

程序区域中的标签。

constant

任何

32

位常数。

symbol

+

constant

标签加上

32

位常数。

用法

MOV32

伪指令的主要功能有:

当单个指令中无法生成立即数时,生成文字常数。

将相对于程序的地址或外部地址载入寄存器中。

无论链接器将包含

MOV32

ELF

代码段置于何处,该地址始终有效。

Note

以这种方式加载的地址是在链接时确定的,因此代码不是位置无关的。

如果所引用的标签位于

Thumb

代码中,则

MOV32

将会设置该地址的

Thumb

位(位

0)。

体系结构

此伪指令在

ARMv6T2

ARMv7

中的

ARM

Thumb

状态下均有效。

LDR

伪指令

将以下项之一载入寄存器:

一个

32

位常数值

一个地址。

Note

本节仅介绍

LDR

指令。

有关

LDR

指令

的详细信息,请参阅

内存访问指令。

有关使用

LDR

伪指令加载常数的信息,请参阅用

LDR

Rd,

=const

加载。

语法

LDR{cond}{w}

Rt,=[expr

|

label‑expr]

其中:

cond

是一个可选的条件代码(请参阅条件执行)。

W

是可选的指令宽度说明符。

Rt

是要加载的寄存器。

那是不可能的,除非你加入了调试信息,也就是编译的时候加入了-g参数,然后用gdb调试就可以显示。最大程度上查看一个elf文件信息。

readelf -Wa aout | head

readelf -wi aout

readelf -p comment aout

objdump -s --section comment audioplayer

如下:

[root@localhost rootfs]# readelf -Wa bin/gzip

复制代码

ELF Header:

Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

Class: ELF32

Data: 2's complement, little endian

Version: 1 (current)

OS/ABI: UNIX - System V

ABI Version: 0

Type: EXEC (Executable file)

Machine: ARM

Version: 0x1

Entry point address: 0xa080

Start of program headers: 52 (bytes into file)

Start of section headers: 1975444 (bytes into file)

Flags: 0x5000002, has entry point, Version5 EABI

Size of this header: 52 (bytes)

Size of program headers: 32 (bytes)

Number of program headers: 6

Size of section headers: 40 (bytes)

Number of section headers: 25

Section header string table index: 24

Section Headers:

[Nr] Name Type Addr Off Size ES Flg Lk Inf Al

[ 0] NULL 00000000 000000 000000 00 0 0 0

[ 1] noteABI-tag NOTE 000080f4 0000f4 000020 00 A 0 0 4

[ 2] init PROGBITS 00008114 000114 00000c 00 AX 0 0 4

[ 3] text PROGBITS 00008120 000120 17fcfc 00 AX 0 0 16

[ 4] __libc_freeres_fn PROGBITS 00187e1c 17fe1c 000f20 00 AX 0 0 4

[ 5] __libc_thread_fre PROGBITS 00188d3c 180d3c 0000e4 00 AX 0 0 4

[ 6] fini PROGBITS 00188e20 180e20 000008 00 AX 0 0 4

[ 7] rodata PROGBITS 00188e28 180e28 058147 00 A 0 0 8

[ 8] __libc_subfreeres PROGBITS 001e0f70 1d8f70 00005c 00 A 0 0 4

[ 9] __libc_atexit PROGBITS 001e0fcc 1d8fcc 000004 00 A 0 0 4

[10] __libc_thread_sub PROGBITS 001e0fd0 1d8fd0 000008 00 A 0 0 4

[11] ARMextab PROGBITS 001e0fd8 1d8fd8 001b04 00 A 0 0 4

[12] ARMexidx ARM_EXIDX 001e2adc 1daadc 006ea8 00 AL 3 0 4

[13] tdata PROGBITS 001f1984 1e1984 000018 00 WAT 0 0 4

[14] tbss NOBITS 001f199c 1e199c 000034 00 WAT 0 0 4

[15] init_array INIT_ARRAY 001f199c 1e199c 000004 00 WA 0 0 4

[16] fini_array FINI_ARRAY 001f19a0 1e19a0 000008 00 WA 0 0 4

[17] jcr PROGBITS 001f19a8 1e19a8 000004 00 WA 0 0 4

[18] datarelro PROGBITS 001f19ac 1e19ac 00002c 00 WA 0 0 4

[19] got PROGBITS 001f19d8 1e19d8 00007c 04 WA 0 0 4

[20] data PROGBITS 001f1a58 1e1a58 0008f7 00 WA 0 0 8

[21] bss NOBITS 001f2350 1e234f 004828 00 WA 0 0 8

[22] __libc_freeres_pt NOBITS 001f6b78 1e234f 00003c 00 WA 0 0 4

[23] ARMattributes ARM_ATTRIBUTES 00000000 1e234f 00002b 00 0 0 1

[24] shstrtab STRTAB 00000000 1e237a 000118 00 0 0 1

Section to Segment mapping:

Segment Sections

00 ARMexidx

01 noteABI-tag init text __libc_freeres_fn __libc_thread_freeres_fn fini rodata __libc_subfreeres __libc_atexit __libc_thread_subfreeres ARMextab ARMexidx

02 tdata init_array fini_array jcr datarelro got data bss __libc_freeres_ptrs

03 noteABI-tag

04 tdata tbss

Attribute Section: aeabi

File Attributes

Tag_CPU_name: "5TE"

Tag_CPU_arch: v5TE

Tag_ARM_ISA_use: Yes

Tag_THUMB_ISA_use: Thumb-1

Tag_ABI_PCS_wchar_t: 4

Tag_ABI_FP_denormal: Needed

Tag_ABI_FP_exceptions: Needed

Tag_ABI_FP_number_model: IEEE 754

Tag_ABI_align8_needed: Yes

Tag_ABI_align8_preserved: Yes, except leaf SP

Tag_ABI_enum_size: int

Tag_unknown_44: 1 (0x1)

复制代码

How to retrieve the GCC version used to compile a given ELF executable http://stackoverflowcom/questions/2387040/how-to-retrieve-the-gcc-version-used-to-compile-a-given-elf-executable

  QUES: I'd like to retrieve the GCC version used to compile a given executable I tried readelf but didn't get the information Any thoughts

  ANS: To complete what others have said: it's not stored in the object (or exe) file, unless you compile with debugging information! (option -g) If you compile with debug info, you can get it back with readelf:  

复制代码

[root@localhost test]# gcc ac

[root@localhost test]# readelf -wi aout

[root@localhost test]# gcc ac -g

[root@localhost test]# readelf -wi aout

The section debug_info contains:

Compilation Unit @ offset 0x0:

Length: 135

Version: 2

Abbrev Offset: 0

Pointer Size: 8

<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)

DW_AT_stmt_list : 0

DW_AT_high_pc : 0x400453

DW_AT_low_pc : 0x400448

DW_AT_producer : GNU C 412 20080704 (Red Hat 412-55)

DW_AT_language : 1 (ANSI C)

DW_AT_name : ac

DW_AT_comp_dir : /work/farsight/test

<1><61>: Abbrev Number: 2 (DW_TAG_subprogram)

DW_AT_external : 1

DW_AT_name : main

DW_AT_decl_file : 1

DW_AT_decl_line : 4

DW_AT_prototyped : 1

DW_AT_type : <83>

DW_AT_low_pc : 0x400448

DW_AT_high_pc : 0x400453

DW_AT_frame_base : 0 (location list)

<1><83>: Abbrev Number: 3 (DW_TAG_base_type)

DW_AT_name : int

DW_AT_byte_size : 4

DW_AT_encoding : 5 (signed)

复制代码

  ANS2:

arm支持ddr,只不过内存形式因为节省空间,都是焊接上去的。就像笔记本内存和台式机内存虽然差不多,但是完全不兼容

现在最先进的arm内存是LP-DDR3 1066,Note3使用的。