Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Что делает прогу 32-х разрядной???


Автор: suvolod 15.5.2006, 10:49
Пожалуйста, поясните мне, что делает прогу 32-х разрядной. До сегодняшнего дня я наивно полагал, что этим занимается директива .386 или выше, которая разрешает работать с 32-х разрядными адресами. Онако, просматривая как-то скомпилированный exe-шник через  CodeView, увидел что все введенные мной команды типа mov eax, var2 подменяются на mov ax, var2. То есть, видимо, компилятор, не смотря на директиву .386,  считает  программу 16-разрядной и оперирует 16-разрядными регистрами. 

Автор: Akina 15.5.2006, 15:03
Директива .386 РАЗРЕШАЕТ использование 32-битного кода. В тексте программы. И только.

 

Автор: Aike 15.5.2006, 16:21
Если не ошибаюсь, то эта строчка: .model flat, stdcall
Указывающая использовать "плоскую" память, которая используется в win32 приложениях. 

Автор: Exekutor 16.5.2006, 06:26
Думаю, использование 32-х разрядных регистров 

Автор: ds29 24.5.2006, 12:45
..
.386
.486
..

и т.д. ты просто ГВОРИШЬ своему компилятору, что будешь имспользовать набор инструкций данного процессора.


32-х битные регистры моно использовать и в 16-ти разрядних программах (под DOS, например или WIN3.1)

---------
Цитата

 Онако, просматривая как-то скомпилированный exe-шник через  CodeView, увидел что все введенные мной команды типа mov eax, var2 подменяются на mov ax, var2.


этого не модет быть, если var2 - DWORD , то будет только mov eax, var2 , аналогично , если var2 - WORD, то будет только mov ax, var2. и никак иначе.



-------
.MODEL FLAT, STDCALL

  .MODEL - это ассемблеpная диpектива, опpеделяющая модель памяти вашей пpогpаммы. Под Win32 есть только одна - плоская модель. STDCALL говоpит MASM'у о поpядке пеpедачи паpаметpов, слева напpаво или спpава налево, а также о том, кто уpавнивает стек, после того как функция вызвана. 
--------


 

Автор: Exekutor 24.5.2006, 13:11
Цитата

32-х битные регистры моно использовать и в 16-ти разрядних программах (под DOS, например или WIN3.1)


Я, конечно, не пробовал, но сомневаюсь, что программа написанная на асме с использованием 32-х битных регистров запустится на машине где установлен дос ранних версий. Если ты утверждаешь обратное, дай ссылки на что ты опирался, делая этот вывод. 

Автор: ds29 24.5.2006, 13:37
гг, шутишь??, вот одни из моих процедур.

Код

;[bin2asc_.inc] -универсальная п/п перевода из BIN в ASCII 
;    D.S.    &    D.$.
;              $oft
;BIN -> ASC II
;********************************************************************
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;***    ***    ***    ***
;BIN -> ASC II
bin2asc_eax    proc    far
    mov    edx,00        ;очистить EDX
    mov    ecx,0010    ;фактор деления
;!!    lea    si,ascval+3     ;адрес ASC        
;!!    mov    eax,binval      ;двоичное число
c20:
    cmp    eax,0010    ;значение меньше 10?
    jb    c30             ;    ДА - выйти
    xor    edx,edx         ;очистить часть часного
    div    ecx             ;разделить на 10
    or    dl,30h          ;в ASCII
    mov    [si],dl         ;записать ASCII - символ
    dec    si              
    jmp    c20
c30:
    or    al,30h          ;записать последнее часное
    mov    [si],al         ;как ASCII - символ
    ret
bin2asc_eax    endp
;********************************************************************
;********************************************************************


использую SI & DI , т.к. сегм. адр., когда использую данную проц. вод WIN32, заменя на ESI , EDI.


p.s.  а причём тут DOS? , это зависит ТОЛЬКО от процессора (а чего сам не попробывал, секундное дело??)
 

Автор: Exekutor 24.5.2006, 14:27
Цитата

а чего сам не попробывал, секундное дело??


Так на работе, до дома еще пара часов. 

Автор: BUGOR 25.5.2006, 08:24
Тут всё-таки надо определиться с какого берега, так сказать, смотреть, если со стороны операционной системы, то она определяет 32разрядность по началу структуры IMAGE_NT_HEADERS. Если со стороны компилятора то это конечно заголовок исходника, который так или иначе отличается у программ 16 и 32 разрядных. Если со стороны программиста, то тут просто опыт и некоторый здравый смысл и для вас не составит труда найти отличия между 16ти и 32х разрядными программами)

Цитата
а причём тут DOS?


Дай пример программы(готовый exe), где используются 32 разрядные регистры и 32 разрядная модель адрессации и который бы работал в ранних версиях ДОС(которые на уровне ядра не предусматривают использования подобных вещей). Я не отрицаю такой возможности, просто посмотреть на это очень хочется. 

Автор: ds29 25.5.2006, 12:07
под ДОС предусмотрен ТОЛЬКО реальный режим, и 16-ти разрядная адрисация памяти (сегменты 64kb), не буду цитировать, посотри внимательней, я только демонстрировал использование 32-х разрядных регистров в программах под ДОС (именно такой был вопрос), а "32 разрядная модель адрессации" т.е. плоская модель памяти доступна в защищённом режиме, это и есть присуцтвие WIN32 среды.

т.е. программа про которую ты говоришь, должга иметь "драйвер памяти".

а использование 32-х разрядних регистров зависит ТОЛЬКО от процессора.,
так как и использование 64-х разрядных регистров (rax, ...) , возможно в WIN32 системе. 

Автор: sgi1981 26.5.2006, 17:04
Цитата(ds29 @ 25.5.2006,  12:07)
под ДОС предусмотрен ТОЛЬКО реальный режим, и 16-ти разрядная адрисация памяти (сегменты 64kb), не буду цитировать, посотри внимательней, я только демонстрировал использование 32-х разрядных регистров в программах под ДОС (именно такой был вопрос), а "32 разрядная модель адрессации" т.е. плоская модель памяти доступна в защищённом режиме, это и есть присуцтвие WIN32 среды.

т.е. программа про которую ты говоришь, должга иметь "драйвер памяти".

а использование 32-х разрядних регистров зависит ТОЛЬКО от процессора.,
так как и использование 64-х разрядных регистров (rax, ...) , возможно в WIN32 системе.

И не только !

Процессор можно также перевести в режим линейной адресации памяти, где доступно все 4 гигабайтное адресное пространство в реальном режиме (включая области памяти разных устройств компьютера, например видеоадаптера с 128 МБ-айтами памяти).
У меня например видеоадаптер настроен на участки адресного пространства
DE000000...DEFFFFFF
D0000000...D7FFFFFF
И ДОС будет правильно работать, если её конечно не затереть по ошибке.

Ну, кому зателось проэкспериментировать ?
Архив в низу.

А дополню своими словами так.
Просто сначала нужно оформить дескрипторную таблицу в которой описан сегмент памяти на все 4 гигабайтное адресное пространство. 
Потом подготовить процессор к защищенному режиму (настроить системные регистры).
Потом перевести процессор в защищенный режим.
В сегментный регистр GS занести селектор. Размер сегмента запишется в теневую область сегментного регистра (она так просто не доступна, а только самому процессору).
Потом просто переводим обратно процессор в реальный режим и адресуем через сегментный регистр GS все адресное пространство адресной шины процессора.

Вот и всё.

Удачи экспериментаторам ! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)