Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повторная инициализация DS 
:(
    Опции темы
Compositum
Дата 14.3.2012, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Доброго времени суток.
Читаю Питера Абеля. Фрагмент кода:
Код

...
ASSUME CS:CODE,DS:DATA,SS:STACK
MOV AX,DATA
MOV DS,AX
...

Абель пишет, что после ASSUME обязательно нужно присваивать регистру DS нужный адрес сегмента данных (вторая и третья строчки кода). Я не понял этого... Мы ведь в ASSUME уже присвоили регистрам CS, DS и SS нужные адреса (насколько я понял)... Тогда для чего выполнять повторное присваивание регистру DS? Мы ведь для CS и SS этого не делаем. Чем так выделился DS?

Best Regards

Это сообщение отредактировал(а) Compositum - 14.3.2012, 09:50
PM   Вверх
500mhz
Дата 14.3.2012, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



потому что он норкоман
заголовок ехе файла (мсдос часть) выглядит так

Код

struct dos_header 
{
  unsigned short e_magic;                     // Magic number
  unsigned short e_cblp;                      // Bytes on last page of file
  unsigned short e_cp;                        // Pages in file
  unsigned short e_crlc;                      // Relocations
  unsigned short e_cparhdr;                   // Size of header in paragraphs
  unsigned short e_minalloc;                  // Minimum extra paragraphs needed
  unsigned short e_maxalloc;                  // Maximum extra paragraphs needed
  unsigned short e_ss;                        // Initial (relative) SS value
  unsigned short e_sp;                        // Initial SP value
  unsigned short e_csum;                      // Checksum
  unsigned short e_ip;                        // Initial IP value
  unsigned short e_cs;                        // Initial (relative) CS value
  unsigned short e_lfarlc;                    // File address of relocation table
  unsigned short e_ovno;                      // Overlay number
  unsigned short e_res[4];                    // Reserved words
  unsigned short e_oemid;                     // OEM identifier (for e_oeminfo)
  unsigned short e_oeminfo;                   // OEM information; e_oemid specific
  unsigned short e_res2[10];                  // Reserved words
  unsigned long  e_lfanew;                    // File address of new exe header
};



Как мы видим значения cs, ss,sp  определены там, а ds после запуска может содержать что угодно, поэтому его нужно явно указывать.


--------------------

PM MAIL ICQ   Вверх
Compositum
Дата 14.3.2012, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



т.е. для dos приложений наличие в ASSUME выражения "DS:DATA" попросту игнорируется?
PM   Вверх
500mhz
Дата 14.3.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Код

ASSUME CS:CODE,DS:DATA,SS:STACK

это не команда ассемблера а макрос компилятора который намекает линковщику какие значения засунуть в заголовок файла.


--------------------

PM MAIL ICQ   Вверх
LeonidPr
Дата 14.3.2012, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2012
Где: г. Чебоксары

Репутация: нет
Всего: 1



Цитата с citforum-а из доки по MASM
Цитата

ASSUME сегмент:имя[,сегмент:имя].
ASSUME сегментный_регистр:NOTHING
ASSUME NOTHING

   Задает сегментный регистр,  который будет использоваться для
вычисления действующего адреса для всех меток и переменных, опре-
деленных  для  сегмента  или группы сегментов с указанным именем.

Я так понимаю, что директива ASSUME указывает, какой сегментный регистр будет использоваться для доступа к переменным, объявленным в сегменте с указанным именем
Например:

Код

data1 segment
  x1 db 20
data1 ends

data2 segment
  x2 db 25
data2 ends

stack segment stack
stk db 1024 dup(?)
stack ends

code segment
assume cs: code, ds: data1, es: data2, ss: stack

mov DX, data1
mov DS, DX

mov DX, data2
mov ES,DX

mov AH, x2
mov AL,  x1
...
code ends



если бы в список ASSUME не было внесено es:data2, то ассемблер бы не знал, через какой сегментный регистр адресоваться к переменной x2.
Мы же ему явно указываем - через ES




--------------------
pkunzip.zip
PM MAIL   Вверх
500mhz
Дата 14.3.2012, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



смотря чем компилять )
Код

format mz

segment main

start:
        push main_data
        pop ds
        mov   ah,09
        mov   dx,message
        int   21h
        
        mov   ax,4c00h
        int   21h


segment main_data

message   db "Hello world", "$"      



--------------------

PM MAIL ICQ   Вверх
LeonidPr
Дата 14.3.2012, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2012
Где: г. Чебоксары

Репутация: нет
Всего: 1



Ну я так понял (по примеру кода и по книге), что человек пользуется TASM или MASM.
Там это актуально.
Цитата

смотря чем компилять )

Я так понимаю это FASM? Год назад чуток поковырялся в нем (KolibriOS заинтересовала).
Насколько я понимаю, директива ASSUME имеет предписательный характер (предписывает ассемблеру вносить префикс сегмента перед инструкцией, обращающейся к данным внутри него), хотя за обращение к данным, расположенным в сегменте, не упомянутом в ASSUME, вы в TASM/MASM получите сообщение об ошибке.
Видимо разработчики FASM возложили обязанность следить за тем, через какой сегментный регистр обращаться к данным на плечи программиста.
Т.е. мой пример выглядел бы как-то так:
Код

mov AH, ES:x2
mov AL, DS:x1

--------------------
pkunzip.zip
PM MAIL   Вверх
Compositum
Дата 14.3.2012, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



В книге описывается  работа с MASM 6.1.  У меня на руках Windows XP SP3 x86 с установленной на ней MS Visual Studio 2010. Соответственно хочу воспользоваться ассемблером, который присутствует в составе этой IDE - Macro Assembler Version 10.00.40219.01.
В указанной мною книге имеется такой код:
Код

PAGE 60,132
TITLE A04ASM1 (EXE) Операции перемещения и сложения
;-------------------------------------------
STACK SEGMENT PARA STACK 'Stack'
    DW 32 DUP(0)
STACK ENDS
;-------------------------------------------
DATASEG SEGMENT PARA 'Data'
    FLDD DW 215
    FLDE DW 125
    FLDF DW ?
DATASEG ENDS
;-------------------------------------------
CODESEG SEGMENT PARA 'Code'
    MAIN PROC FAR
        ;инициализируем сегментные регистры
        ASSUME CS:CODESEG,DS:DATASEG,SS:STACK
        MOV AX,DATASEG
        MOV DS,AX
        
        ;запишем в FLDF сумму FLDD и FLDE
        MOV AX,FLDD
        ADD AX,FLDE
        MOV FLDF,AX

        ;завершаем работу программы
        MOV AX,4C00H
        INT 21H
    MAIN ENDP
CODESEG ENDS
    END MAIN
;-------------------------------------------

Данный код я хочу сначала оттранслировать, затем скомпоновать.
Запускаю командную консоль MS Visual Studio 2010:
Код

%comspec% /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86

задаю такую команду:
Код

ML /Fl /Fm C:\MASM\A04ASM1.ASM /Fo C:\MASM\A04ASM1.obj

Однако получаю следующий результат:
Код

Setting environment for using Microsoft Visual Studio 2010 x86 tools.

C:\Program Files\Microsoft Visual Studio 10.0\VC>ML /Fl /Fm C:\MASM\A04ASM1.ASM
/Fo C:\MASM\A04ASM1.obj
Microsoft (R) Macro Assembler Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: C:\MASM\A04ASM1.ASM
C:\MASM\A04ASM1.ASM(1) : fatal error A1000:cannot open file : A04ASM1.obj

C:\Program Files\Microsoft Visual Studio 10.0\VC>

Я так понял, что по какой-то причине не был создан файл A04ASM1.obj. Проверил листинг - вроде ошибок нет... 
Если кто-нить может помочь - буду весьма признателен.

Подробность справки оставляет желать лучшего:
Код

Setting environment for using Microsoft Visual Studio 2010 x86 tools.

C:\Program Files\Microsoft Visual Studio 10.0\VC>ml /?
Microsoft (R) Macro Assembler Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        ML [ /options ] filelist [ /link linkoptions ]

/Bl<linker> Use alternate linker          /safeseh Assert all exception
/c Assemble without linking                        handlers are declared
/Cp Preserve case of user identifiers     /Sf Generate first pass listing
/Cu Map all identifiers to upper case     /Sl<width> Set line width
/Cx Preserve case in publics, externs     /Sn Suppress symbol-table listing
/coff generate COFF format object file    /Sp<length> Set page length
/D<name>[=text] Define text macro         /Ss<string> Set subtitle
/EP Output preprocessed listing to stdout /St<string> Set title
/F <hex> Set stack size (bytes)           /Sx List false conditionals
/Fe<file> Name executable                 /Ta<file> Assemble non-.ASM file
/Fl[file] Generate listing                /w Same as /W0 /WX
/Fm[file] Generate map                    /WX Treat warnings as errors
/Fo<file> Name object file                /W<number> Set warning level
/Fr[file] Generate limited browser info   /X Ignore INCLUDE environment path
/FR[file] Generate full browser info      /Zd Add line number debug info
/G<c|d|z> Use Pascal, C, or Stdcall calls /Zf Make all symbols public
/I<name> Add include path                 /Zi Add symbolic debug info
/link <linker options and libraries>      /Zm Enable MASM 5.10 compatibility
/nologo Suppress copyright message        /Zp[n] Set structure alignment
/omf generate OMF format object file      /Zs Perform syntax check only
/Sa Maximize source listing
/errorReport:<option> Report internal assembler errors to Microsoft
    none - do not send report
    prompt - prompt to immediately send report
    queue - at next admin logon, prompt to send report
    send - send report automatically

C:\Program Files\Microsoft Visual Studio 10.0\VC>


Спасибо.

Это сообщение отредактировал(а) Compositum - 14.3.2012, 21:47
PM   Вверх
LeonidPr
Дата 15.3.2012, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2012
Где: г. Чебоксары

Репутация: нет
Всего: 1



Цитата

В книге описывается  работа с MASM 6.1

Вот им и надо пользоваться, можно версию поновее поискать.
Я не слежу за изданиями Абеля, о вроде все его книги - о программировании под DOS.
Ваша программа то же под DOS. нельзя её собирать в Visual Studio, эта IDE не предназначена
для создания DOS приложений.
Вот в этой ветке я давал ссылку, где можно скачать masm.
Попробуйте им попользоваться.
Можете скачать TASM, Borland C 3.1, Turbo Pascal 7.0.
В любой их этих пакетов входит ассемблер TASM. Мне кажется, любой из примеров из вашей книги он соберет.
Хотя лучше всего конечно найти MASM 6.1 (тот, который описывается в книге), не нужно будет тогда отвлекаться
на всякие различия в ассемблерах, а сконцентрироваться на изучении языка и архитектуры ЭВМ.

Это сообщение отредактировал(а) LeonidPr - 15.3.2012, 07:13
--------------------
pkunzip.zip
PM MAIL   Вверх
Compositum
Дата 15.3.2012, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Дело в том, что я бы хотел пользоваться такими инструментами, которые пригодились бы мне в работе. Можно конечно по книгам писать под DOS, но ведь в реальной жизни мне придётся писать под Windows, Linux, Mac OS. Книг на русском, в котором бы программирование на ассемблере рассматривалось бы на Yasm/Fasm под указаные мною ОС я не видел (за исключением этой, но для меня, как для новичка, Абель излагает материал гораздо понятней и подробней).
PM   Вверх
LeonidPr
Дата 15.3.2012, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2012
Где: г. Чебоксары

Репутация: нет
Всего: 1



Цитата

Дело в том, что я бы хотел пользоваться такими инструментами, которые пригодились бы мне в работе.

У каждого инструмента есть свое назначение. Использование его не по назначению приведет к тому, что либо вы вообще ничего не сможете сделать этим инструментом, либо сделаете, но через одно место.
Цитата

Можно конечно по книгам писать под DOS, но ведь в реальной жизни мне придётся писать под Windows, Linux, Mac OS.

Тогда почему вы читаете книгу, в которой говорится как писать под DOS?
Цитата

но для меня, как для новичка, Абель излагает материал гораздо понятней и подробней

Абель предлагает примеры программ под DOS. Эти программы не предполагают какого-либо использования возможностей, предоставляемых вам со стороны Windows. Да, их можно запустить в Windows, но от этого они не становятся полноценными Windows приложениями.
Вы противоречите сами себе. Говорите, что хотите писать под Windows, Linux, Mac OS, но при этом читаете книгу по программированию в DOS.
Во-первых, в разделе ASM есть тема, в которой обсуждаются книги по ассемблеру. Поищите там, может найдете что-нибудь более подходящее чем Абель (могу предложить книгу Юрова, вернее обе книги - учебник и практикум).
Во-вторых, если вы все же хотите учиться по Абелю, тогда готовьтесь, что вам придется какое-то время поучиться программировать под DOS. ИМХО, в чем-то полезный опыт. Когда более-менее поймете что к чему,
сможете ориентироваться в ассемблере и понимать более сложные книжки, перейдете к их изучению.
--------------------
pkunzip.zip
PM MAIL   Вверх
500mhz
Дата 15.3.2012, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



для программирования на асме под винду и вообще есть прекрасный ресурс wasm.ru


--------------------

PM MAIL ICQ   Вверх
Compositum
Дата 15.3.2012, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(500mhz @ 15.3.2012,  20:36)
для программирования на асме под винду и вообще есть прекрасный ресурс wasm.ru

спасибо, буду изучать.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.