2016-02-18 5 views
-3

Итак, я запускаю _asm с C++ с помощью Visual Studio.Инструкция MOV для регистров

Так что я новичок в программировании сборки, я следую учебнику и знаю, что общий регистр EAX содержит 32 бита, а AX - 16 с AL, AH - низкий/высокий.

Так как бы я мог перемещать несколько команд, используя только инструкцию MOV. Я пробовал делать

MOV AL, 'a', 'c' , 'e' 

но я получаю незаконное количество операндов. Thats только 3, так что AL не может удерживать это значение?

Я попытался после выполнения

MOV EAX, 0 
MOV AL, 'a', 'c' , 'e' 

Так как же я перейду три различных значения или даже больше, как 12 букв в 8 бит? Разве мне не нужно переходить с 0 на eax, чтобы очистить как низкий, так и высокий из 8 бит, позволяя перемещать эти 3 переменные? Я хочу использовать только 8-битный регистр для перемещения в него нескольких значений, в этом случае это 3. Также мне нравится знать, как сделать больше, чем 12 букв в 8 бит. Я читал, что вы сделали бы MOV EAX, но мне не повезло.

Примечание: это не полная программа, я включил проблему только с 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' 
    } 
} 
+1

Вы попробовали 'mov eax, 'ace''? –

+1

Inline asm - не лучший выбор для обучения asm, IMO. Есть несколько предложений в вики http://stackoverflow.com/tags/x86/info. 'mov' не может принимать несколько операндов источника. Вы можете заставить ассемблер выполнять математику для получения значения для непосредственного исходного операнда, но синтаксис выглядит как «mov eax» («a» << 16 | 'c' << 8 | 'e') '. (Или что-то типа того). Обратите внимание, что это одно выражение, которое имеет целочисленное значение. И как вы думаете, 12 букв могут поместиться в 8 бит? Символ ASCII имеет 8 бит. –

+0

Итак, перемещение 0 в EAX позволило бы максимально вставить 8 букв в 8-битный регистр (hi & low). Я понимаю, что сейчас я думал, почему-то был способ сделать это. Спасибо за вашу помощь, я также помню, что mov имеет несколько операндов, – user5894146

ответ

0

В случае, если вы получили только литералы, чтобы подтолкнуть вверх в 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, но мне не повезло.

Я не могу понять, что вы подразумеваете под этим, вы имеете в виду 12 символов внутри EAX. EAX - 32-разрядный, что означает только 4 символа ASCII. Но если то, что вы пытались вставить в EAX, - это шестнадцатеричные цифры (0-9 и a-f), это означает, что вы больше не сможете поместить 8 из них в EAX.

+0

Это должно быть 'shl eax, 8' для переключения на весь байт. Вы смешиваетесь между '' a'' (0x61) и '0xa'? Тем не менее, вам понадобится «xor eax, eax' /' mov al, 0xa'/'shl al, 4' /' или eax, 0xc'/'shl eax, 4' /' или eax, 0xe'. (Это должно избегать замещения частичных регистров на процессорах Intel. В вашей последовательности есть частичная перезагрузка или слияние uop на аппарате перед IvB на втором 'shl', потому что первый' shl' удаляет верхний бит-ясный тег записывая полный регистр с чем-то другим, кроме идиомы обнуления) –

+1

Ваша первая версия версии mov eax, imm32' имеет такую ​​же проблему: попробуйте ''a' * 0x10000 + 'c' * 0x100 + 'e''. Каждый символ ASCII принимает целостный байт (две шестнадцатеричные цифры, а также nibbles) –

+0

Спасибо, Питер, полностью упустил это, по какой-то причине предположил, что это шестнадцатеричная цифра, а не целый символ. Мой ответ исправляется соответственно. – Bishoy

Смежные вопросы