Консультация № 174319
17.11.2009, 14:46
0.00 руб.
0 13 1
Здраствуйте, как написать 32 разрядную программу?
Обращаться к регистрам по edx,eax,ebx и т д?
И нужен ли особый компилятор может для этого?
У меня еах и т. д. считает ошибкой...

Обсуждение

Неизвестный
17.11.2009, 14:50
общий
32-разрядние регистры можно использовать (обращаться) и в 16-ой программе, у меня tasm 2.5 нормально это воспринимает, главое деректива .386
давно
Старший Модератор
31795
6196
17.11.2009, 14:51
общий
Dimon4ik:

Тип процессора нужно указывать в начале программы.
.386
Это если под ДОС
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
17.11.2009, 16:33
общий
Указал директиву. При компиляции нет ошибок, а когда запускаю link :
E:\PROGRA~1\tasm\BIN>tlink pr
Turbo Link Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International
Fatal: 32-bit record encountered in module pr.ASM
давно
Старший Модератор
31795
6196
17.11.2009, 16:47
общий
Dimon4ik:
Покажите код программы.


Должно быть так:
model tiny | small | . . .
.code
.386
тогда у Вас будет 16-ти битный сегмент и 32-х битные регистры
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
17.11.2009, 16:49
общий
потому что Вы используете 32 разрядное смещение
нужен ключ
tlink pr /3
Неизвестный
17.11.2009, 16:55
общий
это ответ
Здравствуйте, Dimon4ik.

Для того, чтобы обращаться к 32-битным регистрам, достаточно поместить директиву
.386
в начало программы. Эта директива определяет тип процессора, а следовательно, допустимые регистры, набор инструкций, режимы адресации и т.п. По директиве .386 разрешается использование всех непривилегированных инструкций процессора 80386. Директива .386Р разрешает также поддержку всех привилегированных инструкций 80386.

Подойдет любой ассемблер, который распознает эту директиву, например, TASM 3.x, MASM 5.x, 6.x. FASM использует немного другой синтаксис, но также может генерировать 32-битный код.

Однако, наличие директивы .386 еще не означает, что программа будет 32-разрядной. К 32-битным регистрам можно обращаться и из 16-битного кода. Для получения 32-разрядной программы, кроме директивы .386, еще и сегменты должны быть типа USE32.

Для TASM (возможно, для MASM аналогично, но у меня нет описания):
Когда вы используете упрощенные директивы определения сегментов, Турбо Ассемблер генерирует сегменты USE32, если директива .386 указана перед директивой .MODEL, и сегменты USE16, если директива .386 указана после директивы .MODEL.

Если используется полное описание сегментов, то для генерации 32-битного кода (и 32-битных адресов при обращении к данным) нужно явно использовать тип USE32, например:

DataSeg SEGMENT USE32
; при обращении к данным из этого сегмента будут использоваться 32-битные смещения.
;....
DataSeg ENDS

CodeSeg SEGMENT DWORD PUBLIC USE32
ASSUME CS:CodeSeg
;....
CodeSeg ENDS

Успехов!
5
Неизвестный
17.11.2009, 17:29
общий
Все вышло. Директиву поставил после .code
Теперь то все вроде бы работает
Спасибо всем.
Неизвестный
17.11.2009, 17:32
общий
У меня маленький вопросик еще будет:
А какие системные .dll файлы использует 32-разрядная программа?
Неизвестный
17.11.2009, 18:10
общий
Цитата: 218629
А какие системные .dll файлы использует 32-разрядная программа?

А это зависит от того, какие функции использует Ваша программа. Например, CreateWindowEx, DialogBoxParam — это user32.dll, ExitProcess — kernel32.dll, GetOpenFileName — comdlg32.dll. Смотрите в MSDN описание функций, там указано в разделе Requirements (требования), какая библиотека.
Неизвестный
17.11.2009, 18:14
общий
Для работы со стеком - push, pop, для занесений значение в регистры - mov, и для команды add испотльзуются .dll файлы?
давно
Старший Модератор
31795
6196
17.11.2009, 18:16
общий
Dimon4ik:
Дополню эксперта amnick
Это должно быть windows-приложение.
В DOS-приложениях используются только прерывание.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
17.11.2009, 18:17
общий
Dimon4ik:
Цитата: 218629
Для работы со стеком - push, pop, для занесений значение в регистры - mov, и для команды add испотльзуются .dll файлы?

Нет не используются, т.к. это команды процессора, а dll - это библиотеки системы.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
17.11.2009, 18:18
общий
Зенченко Константин Николаевич:
Спасибо. Понял.
Форма ответа