在ARM汇编中,

ldr r4, =0x44454433


ldr r4, #0x44454433有什么区别?

#1 楼

第一个ldr r4,= 0x44454433是有效的伪指令

第二个无效的

语法不是针对真实指令的,而是别名为伪指令

汇编器会针对立即值创建正确的指令

可以通过汇编单个指令并反汇编

来回答大多数问题。使用msvc中的armasm
,或者可以将keystone与python一起使用,或者
使用无数的在线汇编程序反汇编程序站点

import sys
from keystone import *
instruction = raw_input("Enter your arm instruction :  ")
print instruction

ks = Ks(KS_ARCH_ARM,KS_MODE_ARM|KS_MODE_THUMB)
blah = ks.asm(instruction)
for i in blah[0]:
    print "%02x " % i, 
print "\n"


执行脚本以获取

:\>python asmarm.py
Enter your arm instruction :  ldr r4,=0x44455533
ldr r4,=0x44455533
00  4c  00  bf  33  55  45  44


另一方面,如果您尝试汇编第二条指令,则会引发错误的意外令牌

:\>python asmarm.py
Enter your arm instruction :  ldr r4,=#0x44554533
ldr r4,=#0x44554533
Traceback (most recent call last):
  File "asmarm.py", line 7, in <module>
    blah = ks.asm(instruction)
  File "c:\python27\lib\site-packages\keystone\keystone.py", line 198, in asm
    raise KsError(errno, stat_count.value)
keystone.keystone.KsError: Unknown token in expression (KS_ERR_ASM_EXPR_TOKEN)


或者您可以使用capstone来分解十六进制字节序列

,如下所示

import sys
from capstone import *
import binascii
inp = binascii.unhexlify( ''.join(sys.argv[1].split()))
cs = Cs(CS_ARCH_ARM , CS_MODE_THUMB)
cs.Detail = True
dis = cs.disasm( inp,  int(sys.argv[2],16))
for i in dis:
    print("0x%x:\t" % i.address),
    print(binascii.hexlify(i.bytes)),
    print("\t%s\t%s" %(i.mnemonic, i.op_str)) 


执行脚本

:\>discap.py "00  4c  00  bf  33  55  45  44" 0x440000
0x440000:       004c    ldr     r4, [pc, #0]
0x440002:       00bf    nop
0x440004:       3355    strb    r3, [r6, r4]
0x440006:       4544    add     r5, r8


如果使用msvc路由,则需要使用以下命令打开vsdev cmdprompt正确的体系结构和易于使用的armasm,并带有如下所示的输入文件

设置正确的arch和主机

C:\>cat bld.bat
pushd ..    
call "C:\Program Files\Microsoft Visual Studio17\Community\Common7\Tools\vsdevcmd.bat" -arch=arm -host_arch=x86   


src文件内容

C:\>cat myasm.asm
    AREA .text, CODE, ARM
test PROC
    ldr r4,=0x44455533
    ENDP    
    END


执行并打开msvc臂devprompt

C:\>bld.bat

C:\>pushd ..

C:\>call "C:\Program Files\Microsoft Visual Studio17\Community\Common7\Tools\vsdevcmd.bat" -arch=arm -host_arch=x86
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.6.1
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
C:\>popd


组装输入文件

C:\>armasm myasm.asm
Microsoft (R) ARM Macro Assembler Version 14.13.26128.0
Copyright (C) Microsoft Corporation.  All rights reserved.


反汇编obj文件

C:\>dumpbin /disasm myasm.obj
Microsoft (R) COFF/PE Dumper Version 14.13.26128.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file myasm.obj

File Type: COFF OBJECT

test:
  00000000: 4C00      ldr         r4,00000004
  00000002: 0000      movs        r0,r0
  00000004: 5533      strb        r3,[r6,r4]
  00000006: 4445      add         r5,r5,r8

  Summary

          60 .debug$S
           8 .text

C:\> 


评论


正是我想要的。感谢您展示顶点和基石。

–not2qubit
18-10-17在22:03

什么是pip包是重点?

–not2qubit
18-10-17在22:22

#2 楼

尽管这是一个简单的LMGTFY问题,但我要回答,因为花了一些时间才找到它。

假设它是32位ARM,那么所有操作码都长4个字节,所以这引起了一个问题如果具有如此大数据的操作码无法容纳4个字节,则可以在操作码中包含32bit值。

ldr r4, =0x44454433


是伪指令。
<
LDR Rd,= const伪指令生成最有效的单个指令以加载任何32位数字。 -第6-111页


另一个const #0x44454433只是一个const值,但是采用这种形式(其中只有32位值,只有该值)似乎无效(不是专家) ARM)。

评论


正确。它只是“从附近的地址加载一个大常数”的一种方便的速记符号。它本身不是指令。反汇编程序可以选择以这种方式显示它,但是实际代码有所不同。

–杂件
18 Mar 25 '18在11:07

如果您对直接在指令中可以表示哪些立即值感到好奇,我认为这是一个很好的资源:alisdair.mcdiarmid.org/arm-immediate-value-encoding

–布伦丹·多兰·加维特(Brendan Dolan-Gavitt)
18 Mar 25 '18 at 19:17