Автор вопроса: sne | Web-сайт:hw.t-k.ru | ICQ: 233286456
.286
.model small
.stack 100h
.data
buff db 12 dup('0'), '$'
.code
start:
mov ax, @data
mov ds, ax
.586
xor eax, eax
cpuid
mov dword ptr buff, ebx
mov dword ptr buff+4, edx
mov dword ptr buff+8, ecx
.286
mov ah, 9h
lea dx, buff
int 21h
mov ax, 4C00h
int 21h
end start
Вот по тихоньку сидел изучал, да вот наткнулся, можно ли вот в таком коде обойтись без переключения на .286 ??? Если убираю, то либо выводит лааажу, либо пишет про недопустимость использования 32-х разрядных регистров, то наоборот...
Это вовсе не переключение, а директива, указывающая минимальный тип процессора.
К примеру .286p - это уже в защищённом режиме (например винда в нём работает).
Хотя я уже и не помню был ли у двойки защищённый режим.
Одно тебе точно могу сказать - это чисто досовая программа. Так как у 80286 процессора длина регистра 16 бит. Для использования всей длины регистров указывай тип процессора .386. Эта директива позволяет создавать WIN32-приложения.
Если ты не знаешь, то у всех Вин32 приложений минимальные требования - 386.
Например в MASM32 во всех примерах указанн именно этот процессор. Если тебе нужны расширения, то ты уже указываешь более современный процессор. К примеру 486 - масштабирование, 586 - MMX и т.д.
Ты же сам заметил что это далеко не Win32 приложение, и мне Win32 совсем тут не нужно, попросту cpuid работает тока начиная с 586'го... я и хотел посмотреть на работу именно в DOS программе... Вот мне и интересно, а как этот код будет выглядеть, без .286 ???
Тут два варианта: либо ассемблер старый; не знает директивы .586 (tasm 3.1 - точно). Либо какие-то параметры при компиляции задаёшь не те. (без параметров в masm 6.11 всё нормально компилится). Пиши. Разберёмся.
Мне проще отослать те несчастные откомпилированные 500 байт, чем разъяснять... Если с самого начала задать .586, то программа откомпилится, вот только при ее выполнении, она вылетит с ошибкой, я тут немного подправил, так при таком раскладе, вообще ничего не выдается...
.586
.model small
.stack 100h
.data
buff db 12 dup('0'), '$'
.code
start:
mov ax, @data
mov ds, ax
xor eax, eax
cpuid
mov dword ptr buff, ebx
mov dword ptr buff+4, edx
mov dword ptr buff+8, ecx
mov ah, 9h
xor edx, edx
lea edx, buff
int 21h
xor eax, eax
mov ax, 4C00h
int 21h
end start
В общем все проблемы из-за DOS и e[a/d]x... Ну не любят они 32-х разрядные регистры, и все тут
И всё же раскрой страшную тайну: каким ассемблером компилил, с какими параметрами, под какую систему запускал...
Проблемы точно не в неприязни dos-приложений к 32-битным регистрам; они с этими регистрами работают отлично. Проблема не в программе вообще, так как у меня она компилируется без ошибок и работает нормально.
Может тогда кто кинет ссылку на нормальный пакет (5 или 6), а то я скачал оджин, а он на любой exe файл - типа это не Win32 PE файл, т.е. он их вообще за exe'щники не признает ((