visual-c++ - 使用内联汇编交换数组中的 2 个整数会导致奇怪的内存值
问题描述
int Perm[4326];
__asm
{ MOV EBX, 6
FACT: MOV Perm[4320 + EBX * 4], EBX
DEC EBX
TEST EBX, EBX
JE FACTEND
JMP FACT
FACTEND: // This puts the numbers 1,2,3,4,5,6 in Perm[4320]...Perm[4325]
//In between there are is some recursion that's not relevant
MOV EBX, 2
XOR ESI,ESI
MOV EAX, Perm[EBX*4+4319]
TEST AL,1
JZ EVEN
MOV ECX, Perm[4320]
MOV Perm[4320], EAX
MOV Perm[EBX * 4 + 4319], ECX
JMP KLOOP
EVEN: MOV ECX, Perm[ESI * 4 + 4320]
MOV Perm[ESI*4 + 4320], EAX
MOV Perm[EBX * 4 + 4319], ECX
KLOOP: INC ESI
从 Perm[4321] 到 Perm [4325] 的内存看起来像这样:
01000000 02000000 03000000 04000000 05000000 06000000
我正在苦苦挣扎的是
MOV EAX, Perm[EBX*4+4319] 结果 EAX 为 00000002
而 MOV ECX Perm[4320*4] 结果 ECX 为 01000000
并且在交换(偶数标签)之后,内存变为
00000002 00000000 03010000 04000000 05000000 06000000
我正在尝试在汇编中实现用于数组排列的堆算法,在本例中为 int 数组。
由于这是小端序,因此 1 在内存中写为 01000000 是没有意义的,因为它应该是 00 00 00 01 ,我也不明白为什么我会用看似相同的指令得到 2 个不同的结果( MOV EAX、Perm 和 MOV ECX、Perm)
解决方案
推荐阅读
- typescript - React Native 样式表合并:传播类型只能从对象类型创建
- wordpress - 在 asp.net core 2.2 应用程序中保护和集成 peachpie wordpress 安装
- java - Quarkus MySQL JDBC 依赖
- php - 用绝对 URL 替换相对 URL PHP
- .net-4.0 - 在调用 Int32 上的方法时发出 IL NullReferenceException
- reactjs - 导入时道具类型出错,Ts(2322)
- azure - 我的 WebAPI 应如何访问 Microsoft Identity Platform 中其他租户公开的其他 API 到我的应用程序中?
- linux - 在使用 Cloudflare 时,依靠“X-Forwarded-For”来限制 Apache 中的 IP 访问是否安全?
- python - 如何在 Python 中“解压缩”列表?
- python - 如何为 Safari 的 Selenium 设置 UA 和 Headless?