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节中的标签[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 constant
和JB constant
是无效的内联汇编器,你必须跳转到一个标签…]这意味着你需要有一个大约100-110字节的标签来创建'l'
和'd'
相关文章:
- 字符串操作 - 字符计数
- 字符串操作主题消息
- 在MySql中使用字符串操作函数有什么问题
- 如何在没有外部库的情况下使用C++03约束执行基于正则表达式的字符串操作
- INC 操作码编译到错误的地址
- 将 lua 脚本转换为等效于它的指令(操作码)
- 如何使用 Win32 WCHAR 执行字符串操作
- 基本字符串操作有问题 [c++, Visual Studio 2013]
- 有没有一种便携式方法可以在 C/C++ 中生成 nop 操作码?
- 字符串操作 C++ 在字符串之后存储整数
- 将字符数复制到新字符串位置的字符串操作,例如 S[0]
- PIN从指令地址获取程序集操作码
- C 比较字符串操作速度
- C++子字符串/字符串操作
- 高级文件和字符串操作
- 使用字符串操作截断整数
- C#和C++中字符串操作的不同基准测试
- 是否有不涉及 I/O 流的 mingw 库原生的就地字符串操作方法
- 如何使用字符串操作来获取输入文本文件的某些部分
- VS在汇编操作码中嵌入字符串