一、关于之前的testasm项目中的test.asm文件出现过的问题
会出现内存越界问题
例如:00004 eb000000 bl |?test@@YAXXZ|
二、进一步了解了cod文件中的字段含义
一、关于之前的testasm项目中的test.asm文件出现过的问题
test.asm文件
EXPORT |?test1@@YAXXZ|
IMPORT |?test@@YAXXZ|
AREA |.text|, CODE, ARM
|?test1@@YAXXZ| PROC
bl |?test@@YAXXZ|
ldr pc, [sp], #4
ENDP
END
会出现内存越界问题
错误原因,缺少对应的str操作
改为:
EXPORT |?test1@@YAXXZ|
IMPORT |?test@@YAXXZ|
AREA |.text|, CODE, ARM
|?test1@@YAXXZ| PROC
str lr, [sp, #-4]!
bl |?test@@YAXXZ|
ldr pc, [sp], #4
ENDP
END
LDR,STR是用于寄存器和外部存储器交换数据指令,注意与MOV的区别,后面只在寄存器或常数交换。
LDR(load)用于把一个32Bit的WORD数据从外部存储空间装入到寄存器中
LDR R0,[R1]; R1的值当成地址,再从这个地址装入数据到R0 (R0=*R1)。
LDR R1,=0x30008000 ; 把地址0x30008000的值装入到R1中,LDR中用常数要用=打头。(注意跟MOV的区别,MOV是#)
ldr r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
用位与的方法赋值STR(Store) 用于把一个寄存器的值存入外部存储空间,是LDR的逆操作。
STR R0,[R1] ; 把R0的值,存入到R1对应地址空间上(*R1 = R0)。
STR R0,=0x30008000 ;把R0中值存入到地址0x30008000
二、进一步了解了cod文件中的字段含义
; Listing generated by Microsoft (R) Optimizing Compiler Version 14.01.60511.01
TTL d:\test\testasm\testasm\cfile.cpp
CODE32
00000 AREA |.drectve|, DRECTVE
DCB "-defaultlib:LIBCMTD "
DCB "-defaultlib:OLDNAMES "
EXPORT |?test2@@YAXXZ| ; test2
IMPORT |?test@@YAXXZ| ; test
00000 AREA |.pdata|, PDATA
|$T2537| DCD |$LN5@test2|
DCD 0x40000301
; Function compile flags: /Odsp
; File d:\test\testasm\testasm\cfile.cpp
00000 AREA |.text|, CODE, ARM
00000 |?test2@@YAXXZ| PROC ; test2
; 4 : {
00000 |$LN5@test2|
00000 e52de004 str lr, [sp, #-4]!
00004 |$M2534|
; 5 : test();
00004 eb000000 bl |?test@@YAXXZ|
; 6 : }
00008 e49df004 ldr pc, [sp], #4
0000c |$M2535|
ENDP ; |?test2@@YAXXZ|, test2
END
例如:00004 eb000000 bl |?test@@YAXXZ|
0004为表示相对于函数开始地址后的偏移
eb000000为编译后的机器代码
将eb000000装换成二进制为1110 1011 0000 0000 0000 0000 0000 0000
各字段对应结构如下图: