如何在_asm汇编代码块中添加代码将unsigned long类型变量i1的各字节分别存入unsigned char变量c1至c4(高位字节存入c1,低位字节存入c4)
拆分无符号长整型变量的字节到单字节变量(x86汇编实现)
要实现把unsigned long类型变量i1的每个字节按高位到低位分别存入unsigned char变量c1(高位字节)、c2、c3、c4(低位字节),我们可以在_asm块里用x86汇编指令完成这个拆分。这里i1的初始值是0xaabbccee,所以最终c1应该是0xaa,c2是0xbb,c3是0xcc,c4是0xee。
以下是完整的可运行代码:
#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的值存入
c4到c1,刚好对应i1从低位到高位的字节,最终实现高位字节存入c1,低位字节存入c4的要求。
另外我修正了原代码的两个小细节:
- 标准C++要求
main函数返回类型必须是int,而非void。 - 用赋值语法初始化
i1,比构造式初始化更直观(两种写法都合法,只是赋值写法更常见)。
运行这段代码后,控制台会输出:results are aa, bb, cc, ee,完全符合预期。
内容的提问来源于stack exchange,提问作者S H A S H A N K




