【发布时间】:2016-02-18 02:58:35
【问题描述】:
所以我正在使用 Visual Studio 使用 C++ 运行 _asm。
所以我是汇编编程的新手,我正在学习一本教科书,并且知道通用寄存器 EAX 保存 32 位,AX 为 16,AL,AH 为低/高。
那么我将如何仅使用 MOV 指令来移动多个命令。我试过做
MOV AL, 'a', 'c' , 'e'
但是我得到了非法数量的操作数。那只有 3,所以 AL 不应该能够保持这个值吗?
我做了之后尝试
MOV EAX, 0
MOV AL, 'a', 'c' , 'e'
那么我如何将三个不同的值甚至更像 12 个字母移动到 8 位?我不应该移动 0 来清除 8 位的低位和高位,从而允许移动这 3 个变量吗?我只想使用 8 位寄存器将多个值移入其中,在本例中为 3。此外,我想知道如何将 12 个字母放入 8 位中。我读到你会做 MOV EAX, 0 但我没有运气。
注意:这不是完整的程序,我只包含了 MOV 的问题。
#include "stdafx.h"
#include "stdio.h"
#include <iostream>
using namespace std;
using std::cout;
using std::cin;
int main(void)
{
char test
_asm
{
MOV EAX, 0
MOV AL, 'a', 'c' , 'e'
}
}
【问题讨论】:
-
你试过
mov eax, 'ace'吗? -
内联 asm 不是学习 asm 的最佳选择,IMO。 stackoverflow.com/tags/x86/info 标签 wiki 中有一些建议。
mov不能采用多个源操作数。您可以让汇编器进行数学运算以生成直接源操作数的值,但语法类似于mov eax, ( 'a' << 16 | 'c' << 8 | 'e' )。 (或类似的东西)。请注意,它是具有整数值的单个表达式。你认为 12 个字母怎么能适合 8 位呢? ASCII 字符是 8 位。 -
我的一部分认为您真的希望使用指向包含字符串并设置字符的内存的指针。
-
由于不清楚他希望如何将字节填充到 EAX 中,以便在 EAX 中获取 0x61636500,您可以使用
mov eax, 'ace\0'。如果您希望 MSB 为零 (0x00616365 ),则可以使用mov eax, 'ace'最初由 Mr Oblivious 建议的 -
@PeterCordes 因为 MASM 语法是 Visual Studio C++ 的一部分,所以我提供了这个示例代码来通过内联汇编器演示 MASM 语法。同样的事情也适用于纯 MASM:rextester.com/edit/JXH99489
标签: c++ assembly cpu-registers mov