【问题标题】:VS embed string in assembly opcodesVS 在汇编操作码中嵌入字符串
【发布时间】:2015-08-01 21:06:45
【问题描述】:

我正在尝试在 Visual Studio 的汇编中编写一个 hello world 程序。我想在这样的指令之间将字符串保存为操作码

call label1
    "hello world"
label1:
    pop esi
    push esi
    call print

如何在 Visual Studio 中执行此操作?

【问题讨论】:

  • 看来您不能:msdn.microsoft.com/en-us/library/h70hd396.aspx [除非您设法设置正确的指令序列以将该字符串形成为指令,但这对于任意字符串可能很难]
  • @MatsPetersson:您假设是内联汇编。这不一定是一个有效的假设。
  • @Mats Petersson 谢谢。
  • @Cheers 和 hth。 - Alf 我正在使用内联汇编。我可以用其他方式吗?
  • @MatsPetersson:是的,相反。 :) 是的,内联汇编中有一种方法,即_emit(就像单个值DB)。相反,如果你有带有 C++ 的 Visual Studio,那么你也有宏汇编器,它是捆绑的,它是 ml.exe

标签: c++ c visual-studio assembly


【解决方案1】:

通过内联汇编,您可以使用 _emit 伪指令,如下所示(此处用于 32 位代码):

auto foo()
    -> char const*
{
    __asm
    {
        mov eax, offset my_data
        jmp epilogue
    my_data:
        _emit 'H'
        _emit 'e'
        _emit 'l'
        _emit 'l'
        _emit 'o'
        _emit '!'
        _emit 0
    }
    epilogue: ;
}

#include <iostream>
using namespace std;
auto main() -> int
{
    wcout << foo() << endl;
}

我不知道有什么方法可以用内联汇编将字符串写成字符串。

我建议改用适当的完整汇编程序。如果您使用的是 Visual Studio,那么您已经安装了它,它是 ml.exe

【讨论】:

    【解决方案2】:

    在微软编译器的内联汇编中,你不能做明显的解决办法

     db "hello world"
    

    所以你必须实际生成产生正确字节的指令序列:

    从我的手工拆卸来看,这应该可以 - 我没有检查这是否给出了正确的顺序

    [也许可以这样做:

     __asm 
      {
        call label1
        _emit(0x68)
        _emit(0x6f) 
        ... // rest of "hello world"
      label1: 
          pop esi
          push esi
          call print
      }
    

    我还没有 Visual Studio 编译器来试用它。不确定是否愿意跳转到不同的 __asm 部分中的标签。]

    PUSH 6f6c6c65h     ; push = 'h', 6f6c6c64 'ello'
    AND  al,al         ; space
    JA   6fh           ; ja = 77 = 'w', 6f = 'o' 
    JB   6ch           ; JB = 72 = 'r', 6c = 'l'
    FS: ADD AL,AL      ; fs = 64 = d, ADD AL, AL = 0
    

    这显然是非常不切实际的,我不会为任何需要维护的东西这样做...... [而且我可能有问题,我希望 JA constantJB constant 在内联汇编程序中无效,你必须跳转到一个标签...这意味着你需要有一个大约 100-110 字节的标签才能使'l''d'

    【讨论】:

    • 嗯,这个答案是错误的。一旦我完成了我的咖啡和饼干以及一个合适的小例子,我会发布一个正确的答案。
    • 删除假设的反对票,因为现在答案已经更正了。由于; 不能作为续行,因此应用新的假设性反对票。
    • @Cheersandhth.-Alf:现在好点了吗?我不认为我个人曾经使用过_emit,但我记得有人制作了一个翻译 3DNow 的预处理器! _emit(或类似的)的说明。
    • 好吧,如上所述,分号技术不起作用。它不是语句分隔符。据我所知,内联汇编没有这样的东西,这意味着实际上不可能通过 C++ 可变参数宏生成指令。但是,在完整的汇编程序中,它们可以通过文本等效宏生成。但是,在完整的汇编程序中,不需要_emit。呵呵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多