refactor(argparse): 将null替换为nullptr以提高C++兼容性
- 在argparse库中将所有null指针常量替换为nullptr - 更新头文件和源文件中的指针初始化和比较操作 - 修改测试文件中的相关断言检查 - 更新AST定义文件中的注释说明
This commit is contained in:
@@ -794,6 +794,138 @@ SCC_MCODE_FUNC void scc_mcode_amd64_movzx_r64_r16(scc_mcode_t *mcode, int dst,
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
|
||||
// ==================== 符号/零扩展加载(内存操作数) ====================
|
||||
|
||||
/**
|
||||
* @brief 从内存加载字节并符号扩展到 64 位 (movsx r64, byte ptr [base])
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param dst 目标 64 位寄存器
|
||||
* @param base 基址寄存器(存储地址)
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_movsx_r64_m8(scc_mcode_t *mcode, int dst,
|
||||
int base) {
|
||||
u8 rex = 0x48; // REX.W = 1
|
||||
if (dst >= 8)
|
||||
rex |= 0x04; // REX.R
|
||||
if (base >= 8)
|
||||
rex |= 0x01; // REX.B
|
||||
scc_mcode_add_u8(mcode, rex);
|
||||
scc_mcode_add_u8(mcode, 0x0F);
|
||||
scc_mcode_add_u8(mcode, 0xBE); // MOVSX r64, r/m8
|
||||
u8 modrm = 0x00 | ((dst & 7) << 3) | (base & 7);
|
||||
if ((base & 7) == 4) {
|
||||
// 需要 SIB 字节 (base == RSP 或 R12)
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
scc_mcode_add_u8(mcode, 0x24); // SIB: [base] 无索引,base=4
|
||||
} else {
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 从内存加载字节并零扩展到 64 位 (movzx r64, byte ptr [base])
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param dst 目标 64 位寄存器
|
||||
* @param base 基址寄存器
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_movzx_r64_m8(scc_mcode_t *mcode, int dst,
|
||||
int base) {
|
||||
u8 rex = 0x48;
|
||||
if (dst >= 8)
|
||||
rex |= 0x04;
|
||||
if (base >= 8)
|
||||
rex |= 0x01;
|
||||
scc_mcode_add_u8(mcode, rex);
|
||||
scc_mcode_add_u8(mcode, 0x0F);
|
||||
scc_mcode_add_u8(mcode, 0xB6); // MOVZX r64, r/m8
|
||||
u8 modrm = 0x00 | ((dst & 7) << 3) | (base & 7);
|
||||
if ((base & 7) == 4) {
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
scc_mcode_add_u8(mcode, 0x24);
|
||||
} else {
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 从内存加载16位并符号扩展到 64 位 (movsx r64, word ptr [base])
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param dst 目标 64 位寄存器
|
||||
* @param base 基址寄存器
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_movsx_r64_m16(scc_mcode_t *mcode, int dst,
|
||||
int base) {
|
||||
u8 rex = 0x48;
|
||||
if (dst >= 8)
|
||||
rex |= 0x04;
|
||||
if (base >= 8)
|
||||
rex |= 0x01;
|
||||
scc_mcode_add_u8(mcode, rex);
|
||||
scc_mcode_add_u8(mcode, 0x0F);
|
||||
scc_mcode_add_u8(mcode, 0xBF); // MOVSX r64, r/m16
|
||||
u8 modrm = 0x00 | ((dst & 7) << 3) | (base & 7);
|
||||
if ((base & 7) == 4) {
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
scc_mcode_add_u8(mcode, 0x24);
|
||||
} else {
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 从内存加载16位并零扩展到 64 位 (movzx r64, word ptr [base])
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param dst 目标 64 位寄存器
|
||||
* @param base 基址寄存器
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_movzx_r64_m16(scc_mcode_t *mcode, int dst,
|
||||
int base) {
|
||||
u8 rex = 0x48;
|
||||
if (dst >= 8)
|
||||
rex |= 0x04;
|
||||
if (base >= 8)
|
||||
rex |= 0x01;
|
||||
scc_mcode_add_u8(mcode, rex);
|
||||
scc_mcode_add_u8(mcode, 0x0F);
|
||||
scc_mcode_add_u8(mcode, 0xB7); // MOVZX r64, r/m16
|
||||
u8 modrm = 0x00 | ((dst & 7) << 3) | (base & 7);
|
||||
if ((base & 7) == 4) {
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
scc_mcode_add_u8(mcode, 0x24);
|
||||
} else {
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 从内存加载32位并符号扩展到 64 位 (movsxd r64, dword ptr [base])
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param dst 目标 64 位寄存器
|
||||
* @param base 基址寄存器
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_movsx_r64_m32(scc_mcode_t *mcode, int dst,
|
||||
int base) {
|
||||
u8 rex = 0x48; // REX.W = 1, 对应 MOVSXD
|
||||
if (dst >= 8)
|
||||
rex |= 0x04;
|
||||
if (base >= 8)
|
||||
rex |= 0x01;
|
||||
scc_mcode_add_u8(mcode, rex);
|
||||
scc_mcode_add_u8(mcode, 0x63); // MOVSXD r64, r/m32
|
||||
u8 modrm = 0x00 | ((dst & 7) << 3) | (base & 7);
|
||||
if ((base & 7) == 4) {
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
scc_mcode_add_u8(mcode, 0x24);
|
||||
} else {
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 算术运算 ====================
|
||||
|
||||
// ---------- 64 位 ----------
|
||||
@@ -1670,6 +1802,74 @@ SCC_MCODE_FUNC void scc_mcode_amd64_xor_r64_imm32(scc_mcode_t *mcode, int dst,
|
||||
scc_mcode_add_u32(mcode, imm);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 64 位按位取反 NOT r64
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param dst 目标寄存器
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_not_r64(scc_mcode_t *mcode, int dst) {
|
||||
u8 rex = 0x48;
|
||||
if (dst >= 8)
|
||||
rex |= 0x01;
|
||||
scc_mcode_add_u8(mcode, rex);
|
||||
scc_mcode_add_u8(mcode, 0xF7);
|
||||
u8 modrm = 0xC0 | (dst & 7) | (2 << 3); // reg/opcode = 2 for NOT
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 32 位按位取反 NOT r32
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param dst 目标寄存器
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_not_r32(scc_mcode_t *mcode, int dst) {
|
||||
u8 rex = 0x40; // REX.W=0
|
||||
if (dst >= 8)
|
||||
rex |= 0x01;
|
||||
scc_mcode_add_u8(mcode, rex);
|
||||
scc_mcode_add_u8(mcode, 0xF7);
|
||||
u8 modrm = 0xC0 | (dst & 7) | (2 << 3); // reg/opcode = 2 for NOT
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 16 位按位取反 NOT r16
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param dst 目标寄存器
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_not_r16(scc_mcode_t *mcode, int dst) {
|
||||
scc_mcode_amd64_emit_width_prefix(mcode, 2);
|
||||
u8 rex = 0x40;
|
||||
if (dst >= 8)
|
||||
rex |= 0x01;
|
||||
scc_mcode_add_u8(mcode, rex);
|
||||
scc_mcode_add_u8(mcode, 0xF7);
|
||||
u8 modrm = 0xC0 | (dst & 7) | (2 << 3); // reg/opcode = 2 for NOT
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 8 位按位取反 NOT r8
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param dst 目标寄存器
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_not_r8(scc_mcode_t *mcode, int dst) {
|
||||
u8 rex = 0x40;
|
||||
int need_rex = scc_mcode_amd64_is_byte_reg_needs_rex(dst);
|
||||
if (dst >= 8)
|
||||
rex |= 0x01;
|
||||
if (need_rex) {
|
||||
scc_mcode_add_u8(mcode, rex);
|
||||
}
|
||||
scc_mcode_add_u8(mcode, 0xF6); // 8位版本使用0xF6
|
||||
u8 modrm = 0xC0 | (dst & 7) | (2 << 3); // reg/opcode = 2 for NOT
|
||||
scc_mcode_add_u8(mcode, modrm);
|
||||
}
|
||||
|
||||
// ==================== 移位 ====================
|
||||
|
||||
// 提供 64 位示例,其他宽度可类似添加
|
||||
@@ -1873,6 +2073,19 @@ SCC_MCODE_FUNC void scc_mcode_amd64_call_rel32(scc_mcode_t *mcode, u32 rel32) {
|
||||
scc_mcode_add_u32(mcode, rel32);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 通过内存地址调用 (call [rip+disp32]) - 通常用于导入表调用
|
||||
*
|
||||
* @param mcode 机器码缓冲区
|
||||
* @param disp 32 位相对偏移
|
||||
*/
|
||||
SCC_MCODE_FUNC void scc_mcode_amd64_call_mem_rip_rel32(scc_mcode_t *mcode,
|
||||
u32 disp) {
|
||||
scc_mcode_add_u8(mcode, 0xFF);
|
||||
scc_mcode_add_u8(mcode, 0x15); // reg=010 (CALL), r/m=101 (RIP+disp32)
|
||||
scc_mcode_add_u32(mcode, disp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 间接跳转 JMP r64
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user