Всем привет! во всех доступных мне источниках (руководство Intel, Зубков, Гук, Орловский, Григорьев) она описана так (обратите внимание на порядок операндов): arpl dest, source И утверждается, что меняется первый операнд. Однако простейшая проверка Код (Text): int main() { __asm { mov ax, 3 mov bx, 16 arpl ax, bx } } дома и на работе показывает, что меняется второй. Это коллективная ошибка или мой глюк?
скорее твой глюк, у меня ничего не меняется, ZF обнуляется(как и должно быть). RPL из ax > RPL из bx, значит в ax остаётся тот же RPL.
во всех доступных мне источниках ... утверждается, что меняется первый операнд У меня все работает так, как написано в мануале. В твоем случае ни один операнд не должен меняться. Единственный эффект от команды с этими операндами - обнуление флага ZF (в PM) либо исключение #UD (в RM или V86). Как ты определил, что меняется bx? В каком режиме и на каком процессоре запускается программа? Каков машинный код операции (должно быть 63 D8)?
Сорри за молчание, сильно занят был. Этот код компилируется VC 2005, запускается под виндой в защищённом режиме. Под отладчиком видно, какие регистры меняются, и получается так, что регистры наоборот Причина оказалась простая и забавная, достаточно открыть disassembly и поразиться Это мне ответили тут http://www.rsdn.ru/Forum/Message.aspx?mid=2211919 Ещё я пробовал под VMWare 5.0, но в реальном режиме она просто повисает на arpl, а в защищённом совсем как-то неправильно работает. А в настоящий реальный режим лень было залезать, но видимо теперь уж придётся.
sergh В реальном режиме 'arpl' дает #UD. Я попробовал этот код на FASM, смотрел в ODBG -- все гут, при значениях 3, 16 меняется только флаг ZF.