You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在_asm汇编代码块中添加代码将unsigned long类型变量i1的各字节分别存入unsigned char变量c1至c4(高位字节存入c1,低位字节存入c4)

拆分无符号长整型变量的字节到单字节变量(x86汇编实现)

要实现把unsigned long类型变量i1的每个字节按高位到低位分别存入unsigned char变量c1(高位字节)、c2c3c4(低位字节),我们可以在_asm块里用x86汇编指令完成这个拆分。这里i1的初始值是0xaabbccee,所以最终c1应该是0xaac20xbbc30xccc40xee

以下是完整的可运行代码:

#include <iostream>
using namespace std;

int main () {  // 标准C++中main的返回类型应为int,修正原代码的void声明
    unsigned char c1;
    unsigned char c2;
    unsigned char c3;
    unsigned char c4;
    unsigned long i1 = 0xaabbccee;  // 用更直观的赋值语法初始化变量

    _asm {
        mov eax, i1          ; 将i1的32位值加载到EAX寄存器,此时EAX = 0xaabbccee
        mov c4, al           ; AL是EAX的低8位,对应i1的最低字节0xee,存入c4
        shr eax, 8           ; 逻辑右移8位,EAX变为0x00aabbcc
        mov c3, al           ; AL现在是0xcc,存入c3
        shr eax, 8           ; 再次右移8位,EAX变为0x0000aabb
        mov c2, al           ; AL现在是0xbb,存入c2
        shr eax, 8           ; 最后一次右移8位,EAX变为0x000000aa
        mov c1, al           ; AL现在是i1的最高字节0xaa,存入c1
    }

    cout.flags(ios::hex);
    cout << "results are " 
         << (unsigned int)c1 << ", " 
         << (unsigned int)c2 << ", " 
         << (unsigned int)c3 << ", " 
         << (unsigned int)c4 << endl;

    return 0;  // 补充main函数的返回值
}

汇编代码说明:

  • mov eax, i1:把i1的32位值加载到EAX寄存器,这是x86汇编处理32位整数的常用寄存器。
  • shr eax, 8:每次逻辑右移8位,会把原寄存器的高8位移动到AL(EAX的低8位)位置,方便我们提取目标字节。
  • 按顺序将AL的值存入c4c1,刚好对应i1从低位到高位的字节,最终实现高位字节存入c1,低位字节存入c4的要求。

另外我修正了原代码的两个小细节:

  1. 标准C++要求main函数返回类型必须是int,而非void
  2. 用赋值语法初始化i1,比构造式初始化更直观(两种写法都合法,只是赋值写法更常见)。

运行这段代码后,控制台会输出:results are aa, bb, cc, ee,完全符合预期。

内容的提问来源于stack exchange,提问作者S H A S H A N K

火山引擎 最新活动