首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual-C++内联汇编程序两个偏移量的差异

Visual-C++内联汇编程序两个偏移量的差异
EN

Stack Overflow用户
提问于 2012-11-17 00:39:55
回答 2查看 1K关注 0票数 1

我正在将代码块从MASM移植到C内联汇编程序(x86,Windows,MS VC)。Foolowing不是真正的代码,只是为了提供一个想法。假设我有一些定义为静态数组的数据,甚至是两个标签之间的代码块,我需要获取它的大小。

代码语言:javascript
复制
    label1:
    bla bla bla
    label2:
    ....
    mov eax, (offset label2 - offset label1)

这样的代码在MASM中工作得很好,但在C中我得到了以下错误消息:"error C2425:'-‘:'second operand’中的非常量表达式“我可以编译:

代码语言:javascript
复制
    mov eax, offset label1
    mov eax, offset label2

我希望编译器在编译时计算(offset label1 - offset label2),但看起来我错了。我也不能添加偏移(为什么?这只是编译过程中添加的两个整数...?)当然,我可以编译mov _ eax,offset _ label2 _ mov _ edx,offset _ label1 _ sub,edx,但这是一个额外的计算常量的代码。有人能给我解释一下吗,我的代码出了什么问题?

会不会是因为搬迁引起的呢?如何让它通过?

期待您的回复,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-17 01:04:44

是的,它可能是由重新定位的威胁引起的,但也可能是处理相对跳转的可变长度指令的威胁。很可能是因为一些小问题,汇编程序编写者采取了简单的方法,实现了一个1遍或两遍的编译器,以便尽快做出最终决定。因此一些方便的表达式是不受支持的。

正如已经在评论中建议的,汇编程序可能仍然支持mov + sub组合。

票数 0
EN

Stack Overflow用户

发布于 2012-11-17 00:56:07

在获得所有标签的固定地址之前,真正的汇编程序可能会多次遍历代码。例如,一些跳跃有短的和长的形式,这取决于你想要跳多远。如果在标签之间有这样的跳跃,则距离取决于跳跃的位置。

C编译器可能会将其中的一部分留给链接器/加载器,并且在编译时不会有固定的值。

您可以很好地将addres计算代码简化为两条指令

代码语言:javascript
复制
mov EAX, offset Label2
sub EAX, offset Label1

我不认为这会破坏代码的性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13420744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档