能力值:
(RANK:510 )
2 楼
前面准备了一段时间,趁着Xarm发布一周年的时候,开始发布这个系列。
希望大家多提宝贵意见!
能力值:
( LV2,RANK:10 )
3 楼
我顶,但不晓得说什么,就顶一下了
能力值:
( LV2,RANK:10 )
4 楼
我坐板凳,支持一下
能力值:
( LV9,RANK:270 )
5 楼
呵呵,顶哈
能力值:
( LV9,RANK:270 )
6 楼
stmfd sp! , { lr } ldmfd sp! , { pc }
ltorg
是什么啊?
能力值:
(RANK:510 )
7 楼
这个问题问得很好!
语法现象不可能一次全部解释,欢迎大家对不了解的语法现象提出问题,一起讨论!
这几条是一个函数的常用框架:
stmfd sp! , { lr } ;把lr寄存器中的函数返回地址保存到堆栈中。以便函数可以正确返回。
ldmfd sp! , { pc } ;将堆栈中保存的返回地址,写入PC寄存器中从函数中返回主程序。
;上面这两条是典型的堆栈寻址方式的指令。
ltorg ;是一条伪指令,告诉构建系统函数中使用的内存地址构建时后放在程序这个位置
因为我们经常会使用 ldr r1 , = dwNum这样的指令将内存地址装载到寄存器中。由于ARM指令机器码编码规则的限制,内存地址是保存在程序中的,并且位置不能离上面那条指令的位置太远。所以使用ltorg指令告诉系统把内存地址放在这个位置。因此ltorg伪指令必须放在程序中肯定不能执行的位置上,否则程序运行时会误将内存地址当作机器码执行出现错误。放置位置可以是:函数返回指令之后或者无条件跳转指令之后。
有个初步了解即可,如果想深入分析需要看一下ARM指令机器码的编码规则,就能理解充分了。
能力值:
( LV2,RANK:10 )
8 楼
真不错,学习
能力值:
( LV9,RANK:270 )
9 楼
AREA |.drectve| , DRECTVE ;
dcb "-defaultlib:corelibc.lib "
dcb "-defaultlib:coredll.lib "
dcb "-defaultlib:BFLib.lib "
dcb "-defaultlib:commdlg.lib "
dcb "-defaultlib:commctrl.lib "
dcb "-defaultlib:crypt32.lib "
dcb "-defaultlib:cxport.lib "
dcb "-defaultlib:iphlpapi.lib "
dcb "-defaultlib:mmtimer.lib "
dcb "-defaultlib:msmqrt.lib "
dcb "-defaultlib:ndis.lib "
dcb "-defaultlib:ole32.lib "
dcb "-defaultlib:oleaut32.lib "
dcb "-defaultlib:secur32.lib "
dcb "-defaultlib:urlmon.lib "
dcb "-defaultlib:wininet.lib "
dcb "-defaultlib:winsock.lib "
dcb "-defaultlib:ws2.lib " 是引入lib库文件吧,如果在.S文件中引入的话,语法是什么啊?
能力值:
(RANK:510 )
10 楼
在MASM32中可以使用includelib指令引入lib文件。但是前期研究Xarm语法时尝试使用这样的指令没有成功。
目前设计的这个语法,会将你看到的这些信息保存到OBJ文件中,当使用link程序连接时,会根据信息查找程序中使用的API。这样做OBJ文件会大一些,但是不影响最终的EXE文件大小。并且一个额外的好处是不必在每次写程序时手动使用includelib引入lib文件了。
能力值:
( LV9,RANK:270 )
11 楼
那如果在.S源代码中引入该用什么语法呢?就是在不用inc的情况下该怎么引入呢?
能力值:
( LV9,RANK:270 )
12 楼
macro
call $FunName
IMPORT $FunName
bl $FunName
mend
还有这些macro mend是语法转译么?如果不引用这个inc在.S中应该怎么写呢?
能力值:
(RANK:510 )
13 楼
使用上述语法和使用includelib语法的效果是一样的。
请注意一个问题:
本质上说:我们并不是把lib引入到s代码中!lib库是在连接的时候由link程序使用的。
按你所说的那种语法我还没有找到,不知道微软的ARM编译连接系统是否支持。如果有兴趣你可以研究一下。
能力值:
(RANK:510 )
14 楼
这是ARM汇编宏定义的写法。
如果不写在INC文件写在S文件里面也可以,不过显然应该把程序中常用的宏定义写在独立的文件里面包含进程序更清晰一些。
能力值:
( LV9,RANK:270 )
15 楼
嘻嘻,明白了。太感谢加百力大哥了。
能力值:
(RANK:510 )
16 楼
macro mend
这样的宏定义语法来自ARM公司标准的ARM汇编语法。
推荐你看看置顶的帖子里面标准的ARM汇编语法虽然和微软的有一些不同,但大体框架相似的。对于加深了解有帮助。你应该不是那么急吧?呵呵。
能力值:
(RANK:510 )
17 楼
不必客气,大家相互讨论进步更大!
Xarm的语法是ARM标准语法+反汇编的结果,开始也是希望仿照MASM32语法便于大家使用,有的难关不好过了就自己创造了一点。
如果后面能够找到更好的解决方法更好!
比如这个 call 宏定义。就是为了方便大家引入API函数。
例如在程序中: call MessageBoxW
实际上先是: import MessageBoxW ; 这句告诉编译系统这个标号是从外部引入的。
然后是: bl MessageBoxW ; 这句是调用函数了。
因为在编译时又引入了一组你前面列出的lib库。
在连接的时候,连接器就可以找到这些API函数在lib中提供的信息了。
能力值:
(RANK:510 )
18 楼
看kuang110学的很急切又特别仔细,不知道是不是公司有这方面的需要?
能力值:
(RANK:510 )
19 楼
补充一点语法研究的路线供大家参考:
我前面搞Xarm的时候是首先学习ARM公司标准的ARM汇编语法。然后一点点在S文件中写入,尝试用微软的编译连接系统构建。如果构建成功则语法可用。否则就得另想办法了。不是所有的标准ARM语法都支持。
比如:标准ARM中用entry标识程序的入口点,微软的编译器就不支持。主函数从WinMain开始而且还必须export。
能力值:
( LV9,RANK:270 )
20 楼
EXTERN MessageBoxW
bl MessageBoxW
也可以。
能力值:
( LV9,RANK:270 )
21 楼
GLOBAL WinMain
也行。
大哥介绍一点反汇编思路哈。
能力值:
( LV9,RANK:270 )
22 楼
不是公司需要啦,只是爱好。
呵呵,刚转行到计算机,目前还在学习。经济危机不好找工作啊。
目前在培训COBOL。
能力值:
( LV9,RANK:270 )
23 楼
ldmia r0!,{r1,R2,R3,R4}
;大哥貌似少写了一个!号
stmia r0!,{r1,R2,R3,R4}
;貌似有人说这是第九中寻址,叫块拷贝寻址。感觉和多寄存器差不多。
能力值:
( LV4,RANK:50 )
24 楼
没想到这个子论坛做得这么大了, 先来个本人在本区的第一回帖, 下次有时间把自己最近的心得发上来.
能力值:
( LV4,RANK:50 )
25 楼
!的功能是:
在将r1 - r4寄存器存放的内容按"ia"的方式存放在r0指示的内存空间以后, 修改r0的值, 使其改变4 * 4 大小.
如果没有!, 则只是存放r1 - r4, r0的值不会变.