Консультация № 126401
08.03.2008, 00:52
0.00 руб.
0 2 2
Здравствуйте эксперты.
Не могу разобратся как передать в ассемблерную вставку значения размером в байт.
При передаче по значению ошибки не возникает, но при передаче по ссылке компиллятор почему-то выдает ошибку несовпадения размеров операндов... (operand size conflict)
Передавать и принимать нужно именно байты, в том то и смысл.

Как сделать чтобы данный код заработал?

Приложение:
#include <iostream>#include <windows.h>using namespace std;inline void rol(byte &h, byte &l, byte bit_ct){ __asm { mov al,l mov cl,bit_ct xor ah,ah rol ax,cl mov l,al or h,ah };};int main(){byte a=5,b=6;rol(a,b,3);cout<<a<<endl<<b;

Обсуждение

Неизвестный
08.03.2008, 11:30
общий
это ответ
Здравствуйте, Вячеслав Шинкаренко!
Аккуратней нужно буковки печатать.
Правильно в приложении.
Удачи!


Приложение:
inline void rol(byte &h, byte &l, BYTE bit_ct){ __asm { mov al,1 mov cl,bit_ct xor ah,ah rol ax,cl mov bl,al or bh,ah };};
Неизвестный
10.03.2008, 12:39
общий
это ответ
Здравствуйте, Вячеслав Шинкаренко!

Не работает потому, что использование ссылок есть неявное использование указателей. Только в случае со ссылками, операции разыменования и взятия адреса компилятор оставляет за собой и код поэтому получается более удобочитаемым.
В ассемблерной вставке таких удобств уже нет, поэтому нужно либо явно использовать указатели, либо сохранять значения во временных переменных:

Приложение:
inline void rol(byte &h, byte &l, byte bit_ct){ byte h_t = h,l_t = l; __asm { mov al,l_t mov cl,bit_ct xor ah,ah rol ax,cl mov l_t,al or h_t,ah }; h = h_t; l = l_t;}
Форма ответа