当前位置: 代码迷 >> 汇编语言 >> vc内嵌汇编的db替换有关问题
  详细解决方案

vc内嵌汇编的db替换有关问题

热度:251   发布时间:2016-05-02 04:33:51.0
vc内嵌汇编的db替换问题。
本帖最后由 wzla333tom 于 2014-06-26 15:10:42 编辑
vc 内嵌汇编是不能用db xxh,xxh...这样的操作方法。

现在我用vc的byte[]={...};来定义的。

我的代码是这样的
__asm{
//...
mov edx, dword ptr ss:[ebp+18h]
mov esi, dword ptr ss:[ebp+14h]
push edx
push esi
push ecx
push edi
call _after            //这个是调用_after标签
mov esi, dword ptr ds:[esi]
add esi, dword ptr ss:[ebp+10h]
mov ecx, dword ptr ss:[ebp+10h]
mov ebx, eax
....
}

__asm
{
    _after:

    //源代码是  db 055h, 08Bh, 0ECh, 083h, 0ECh, 01Ch, 053h, 056h, 08Bh, 075h, 00Ch, 057h...
    //现在用vc 定义的byte数组 byte bts[] ={...};现在里面该怎么写?后面跟着的代码是memset

    //或者用更好的方法替代db定义

    //我尝试使用 push bts 和 call bts 都失败了。
    push bts

    call memset
    //db  055h, 08Bh, 0ECh, 083h, 0ECh, 01Ch, 053h, 056h, 08Bh, 075h, 00Ch, 057h...
    call memset        
    _end:
}

汇编里是不是可以用sub x,20 来定义一个内存区域来存储这个变量。

具体代码应该怎么写?

vc 有个伪指令_emit 相当于db 1个字节 这样太繁琐 而且我也没看到效果。

------解决方案--------------------
你可以写一个转换脚本自动将db或C数组形式转换为_emit的格式,然后将结果字符串复制粘贴到_asm即可.
------解决方案--------------------
__asm
{
_emit 0x55
...
------解决方案--------------------
我有一个不太好的办法,先把你要定义的数据段反汇编一下,插入到代码段,执行的时候跳过去就行了,如下图所示!程序的运行结果如下后面是注释掉数据,用反汇编后的结果替代,程序执行结果想同!
------解决方案--------------------
这个可以用宏来实现,比如:
#define DB(a) __asm __emit a
#define DB2(a, b) __asm __emit a __asm __emit b
#define DB3(a, b, c) DB(a) DB2(b, c)
#define DB4(a, b, c, d) DB2(a, b) DB2(c, d)
#define DB5(a, b, c, d, e) DB(a) DB4(b, c, d, e)
其他依此类推,估计写到DB16就足够了。

然后就可以:
__asm{
  DB16(0x55, 0x8b, 0xec, ...)
}
  相关解决方案