Ассемблер. Начало

версия для печати

В который раз пытаюсь освоить ассемблер и не знаю, на сколько меня хватит. Какими путями я опять пришел к нему, не буду рассказывать. Скажу просто - "надо" :) Вооружившись Гуглем и отбрасывая все, что на данный момент мне не нужно, принял за старт архив рассылки О. Калашникова "Ассемблер? Это просто! Учимся программировать (2001)". Есть еще одноименная книга, но мне пока достаточно chm-файла с выдержками из нее. Внимание! В этом архиве рассылка неполная! За продолжением нужно лезь на соответствующие сайты.

Компилятором я выбрал MASM в сборке Hutch-a. Почему именно этот? Потому, что мне без разницы, я все равно в них не разбираюсь :) Скачать его можно на wasm.ru. Кстати, это оч. полезный ресурс, запомните адрес. Чего я там не нашел, так это Поиска %)

Главная проблема в изучении: рассылка Калашникова древняя, как MS-DOS, и все примеры первой главы запилены именно под DOS. С одной стороны это плюс, т.к. ничего лишнего в коде нет. Но с другой, я два дня потратил, чтобы уломать MASM v10r состряпать мне консольный "Hello, World!" с расширением .com. Конечно, я и другими делами занимался, но пока неделю не провел, читая все подряд по asm-у, рекомендации всяких умников для меня были, что китайская грамота.

Для начала, нужно сменить редактор кода. Это конечно дело вкуса, но убогий вид qeditor-a лично меня повергает в уныние. Я перешел на MasmEd. Возможно не лучший выбор, есть некоторые неудобства, но на первое время пойдет. В настройках прописал пути к MASM и ключи транслятора и линковщика. Именно сочетание нужных ключей позволило наконец собрать работающий com-файл из рассылки.

ml /c
link16 /TINY

Все можно выполнить из командной строки, без всяких редакторов, но я еще не готов к такому аскетизму :) Ключ "/c" транслятора отключает автолинковку. Линкер нужно вызывать, сделаный для линковки 16-разрядных программ, иначе будут только ошибки. В частности, именно из-за попытки собрать com-файл , как 32-разрядное приложение (через link.exe) получалось "fatal error LNK1190: invalid fixup found, type 0x0001". Может оно собралось бы как-то, но в коде не указаны соответствующие директивы и полученный файл врядли будет работать.

Без ключа "/TINY" сегмент стека будет не назначен, о чем при линковке выйдет "warning L4021: no stack segment". В хелпе по MASM я не нашел описания ключей для link16.exe, нужный выловил в инете. Пробовал вместо ключа указывать непосредственно в коде модель работы с памятью - так не работает.

Следующий пример нормально скомпилировался в com-файл. Дизассемблер корректно его разобрал.

;.model tiny ;не работает при сборке com-файла
CSEG segment
org 100h
_start:
mov dx, offset msg
mov ah,9
int 21h
int 20h

msg db 'Hello, word!$'
CSEG ends
end _start

На заметку:

  1. не любая консольная программа будет работать под WinXP, т.к. консоль ограничена в правах, доступе к памяти и т.д. В частности, примеры из рассылки с выводом символов в видеобуфер работать не будут;
  2. если в ключах транслятора указан "/coff", то стартовая метка должна быть с ведущим подчеркиванием, иначе получите "warning A4023: with /coff switch, leading underscore required for start address : start". Этот ключ задает формат создания объектного файла, но эт' уже другая история.

[1oo%, EoF]
Метки: asm, кодинг

Комментарии
Для работы модуля комментариев включите javaScript


Показать/скрыть правила
Имя
[i] [b] [u] [s] [url]
:-) ;-) :D *lol* 8-) :-* :-| :-( *cry* :o :-? *unsure* *oops* :-x *shocked* *zzz* :P *evil*

Осталось 1000 символов.
Код защиты от спама Обновить код
Каждый комментарий проходит ручную модерацию. 100% фильтрация спама.
Продвижение
Время
Метки