簡體   English   中英

VS 在匯編操作碼中嵌入字符串

[英]VS embed string in assembly opcodes

我正在嘗試在 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 部分中的標簽是否高興。]

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM