我正在将代码块从MASM移植到C内联汇编程序(x86,Windows,MS VC)。Foolowing不是真正的代码,只是为了提供一个想法。假设我有一些定义为静态数组的数据,甚至是两个标签之间的代码块,我需要获取它的大小。
label1:
bla bla bla
label2:
....
mov eax, (offset label2 - offset label1)这样的代码在MASM中工作得很好,但在C中我得到了以下错误消息:"error C2425:'-‘:'second operand’中的非常量表达式“我可以编译:
mov eax, offset label1
mov eax, offset label2我希望编译器在编译时计算(offset label1 - offset label2),但看起来我错了。我也不能添加偏移(为什么?这只是编译过程中添加的两个整数...?)当然,我可以编译mov _ eax,offset _ label2 _ mov _ edx,offset _ label1 _ sub,edx,但这是一个额外的计算常量的代码。有人能给我解释一下吗,我的代码出了什么问题?
会不会是因为搬迁引起的呢?如何让它通过?
期待您的回复,谢谢。
发布于 2012-11-17 01:04:44
是的,它可能是由重新定位的威胁引起的,但也可能是处理相对跳转的可变长度指令的威胁。很可能是因为一些小问题,汇编程序编写者采取了简单的方法,实现了一个1遍或两遍的编译器,以便尽快做出最终决定。因此一些方便的表达式是不受支持的。
正如已经在评论中建议的,汇编程序可能仍然支持mov + sub组合。
发布于 2012-11-17 00:56:07
在获得所有标签的固定地址之前,真正的汇编程序可能会多次遍历代码。例如,一些跳跃有短的和长的形式,这取决于你想要跳多远。如果在标签之间有这样的跳跃,则距离取决于跳跃的位置。
C编译器可能会将其中的一部分留给链接器/加载器,并且在编译时不会有固定的值。
您可以很好地将addres计算代码简化为两条指令
mov EAX, offset Label2
sub EAX, offset Label1我不认为这会破坏代码的性能。
https://stackoverflow.com/questions/13420744
复制相似问题