寄存器的 MOV 指令

MOV Instruction for Registers

本文关键字:指令 MOV 寄存器      更新时间:2023-10-16

所以我正在使用Visual Studio运行_asm C++。

所以我是汇编编程的新手,我正在遵循教科书,并且知道通用寄存器 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'
    }
}

如果您只有文字可以推送到 EAX,则可以使用以下代码:

MOV EAX, 'ace'

如果需要一段可以使用三个变量来组成 EAX 上的值的代码,请使用以下代码作为模板,并将文本替换为变量名称。

MOV EAX, 'a' * 0x10000 + 'c' * 0x100 + 'e'

最后,如果您想要一个逐个字符推送的解决方案,您可以使用以下内容:

void init()
{
    _asm
    {
       XOR EAX, EAX
    }
}
void push(char c)
{
    _asm
    {
        SHL EAX, 8
        MOV AL, c
    }
}

我也想知道如何将 12 个字母变成 8 位。我读了 你会做 MOV EAX,0 但我没有运气。

我不明白你的意思,你的意思是 EAX 中的 12 个字符。EAX 是 32 位的,这意味着只有 4 个 ASCII 字符。但是,如果您试图适应 EAX 的是十六进制数字(0-9 和 a-f),这意味着您可以再将其中的 8 个放入 EAX 中。