[英]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 constant
和JB constant
在內聯匯編器中無效,你必須跳轉到標簽...這意味着您需要有一個大約 100-110 字節的標簽才能使'l'
和'd'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.