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:\>
#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
评论
正是我想要的。感谢您展示顶点和基石。
–not2qubit
18-10-17在22:03
什么是pip包是重点?
–not2qubit
18-10-17在22:22