При попытке записи в регистр ah двоичного числа 11111111b, всё проходит нормально: Код (Text): mov ah, 11111111b Но почему тогда при попытке записи в этот же регистр этого же числа, только в шестнадцатиричной форме: Код (Text): mov ah, FFh Транслятор выводит ошибку?? Код (Text): 7 0000 8A 26 0000 mov ah, FFh **Error** 1.ASM(7) Undefined symbol: FFH Транслятор: Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International Объясните, пожалуйста. И не пинайте сразу я только начинаю.
Сенкс! Всё понял. Я дурак. Тут ещё один вопрос хочется спросить: можно ли просто так писать в extended регистры, т.е. eax/ebx/ecx/edx... У меня так почему-то не получается: Код (Text): 7 0000 C7 06 0000 FFFF mov eax, 0FFFFh **Error** 1.ASM(7) Undefined symbol: EAX Может я что-то делаю не так и здесь какой-нибудь фокус нужен? Как вообще можно что-либо записать в старшие 16 бит вышеназванных регистров?
Можно, но, видимо, ты используешь досовский тасм. В досе только 16-битные регистры. Скачай Tasm32, а еще лучше - Masm32.
Scr1pt_ возможно просто не хватает директивы .386 а если дело все таки в ооочень старом асме, то Код (Text): db 66h mov ax, 5678h dw 1234h ; это mov eax, 12345678h ; или db 67h mov [ax], 25 dw 0 ; это mov [eax], 25 ; или dw 6667h mov [ax], bx ; это mov [eax], ebx
Еще вариант, если в начале файла стоит .286 или ничего не указано (команды 8086), то перед 32-разрядной инструкцией ставится .386, а после нее .286 Код (Text): .286 .model tiny ..... .386 movsd .286
2 Mikl__ : Спасибо, с .386 всё заработало. 2 MSoft : Скачал tasm32 5.0 http://wasm.ru/tools/7/tasm5plus.zip, но он проблему не решает! 2 Y_Mur : Попробовал твой код, вроде работает. Но я всё равно не могу объяснить как. Можешь написать небольшие комментарии к коду, если не трудно?
Scr1pt_ А загляни в листинге или дизассемблере - чем отличается под ДОС c директивой .386 mov ax, ... и mov eax, .... )) Я просто вручную дописал недостающие кусочки кода ) 66h - префикс 32 битных данных 67h - ... адреса только под windoй смысл у этих префиксов обратный Когда то ооочень давно на асм вставках в TP6 это сильно выручало )
Листинг: Код (Text): 10 0009 66| B8 0000FFFF mov eax, 0ffffh А что в листинге обозначает прямая вертикальная черта после 66, никто не подскажет? Отделение префикса от самой команды? И что значит в этом коде: Код (Text): db 67h mov [ax], 25 dw 0 ; это mov [eax], 25 регистр, взятый в квадратные скобки? Мой тасм подобного не поддерживает... Код (Text): 11 0007 C7 0019 mov [ax], 25 *Warning* 1.ASM(11) Argument needs type override **Error** 1.ASM(11) Illegal indexing mode
Извините, я ошибся. Просто думал, что если компилятор 32-х разрядный, то при использовании 32-х разрядных регистров не надо впереди ставить директиву .386. Ошибся. Тогда чем вообще отличаются 32-х и 16-ти разрядные компиляторы?
.386 Указывает для какого процессора компилишь, он как известно 32 разрядный, а .286 16 разрядный. На 286 32 разрядные регистры не прокатят. А если директивы нет, вроде вообще под 8086 компилит.
Scr1pt_ А мне кажется что ответ на этот вопрос очевиден, 16-ти не умеет компилить для 32 разряд процов, соответственно .386 не поймёт -).
С чего ты это взял. Он вполне 32 разряден, и даже умеет компилить под win 95, которая тоже 32 разрядная. Я же сказал что по дефолту он компилит под 8086. (16 разрядов).
Блин, я вообще запутался. В чём различие между tasm и tasm32, если оба они могут компилить и под 32, и соответственно и 16 разрядов?
Да ё моё. tasm 5.0 - Я имею ввиду пакет, в котом есть и tasm и tasm32. У тебя что tasm понимает 32 разрядные инструкции?