VS在汇编操作码中嵌入字符串

VS embed string in assembly opcodes

本文关键字:字符串 操作码 汇编 VS      更新时间:2023-10-16

我正试图在visual studio汇编中编写hello world程序。我希望将字符串保存为指令之间的操作码,如

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

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

对于内联汇编,您可以使用_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

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

 db "hello world"

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

从我的手工反汇编中,这应该可以做到-我没有检查这是否给出了正确的序列

也许可以这样做:
 __asm 
  {
    call label1
    _emit(0x68)
    _emit(0x6f) 
    ... // rest of "hello world"
  label1: 
      pop esi
      push esi
      call print
  }

我没有一个Visual studio编译器来尝试它。不确定它是否乐意跳转到另一个__asm节中的标签[j]

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'