Вопрос № 23737: скажите почяму на masm ver.5.31--1992 ms-dos
Ашибок нету А на tasm Turbo Assembler Version 4.1 Copyright (c) 1988, 1996
ВОТ такая херня:
**Error** start.asm(7) Near jump or call to different CS
**Error** start.asm(9) Near jump o...Вопрос № 23739: Добрый день!
Допустим, что в программе встречается строка: buffer equ $. Я прочитал в уроке 009, что при ассемблировании такой строки Ассемблер заменит знак $ на адрес, по которому он расположен. Как выглядит этот адрес (линейный или со смещением...Вопрос № 23743: Здравствуйте уважаемые эксперты,
Мой вопрос касается не столько ассемблера сколько архитектуры процессора – хотелось бы узнать почему процессор использует регистры Ax,Bx, и т.д. А не какие-нибудь другие, то есть почему например регистров именно с...Вопрос № 23759: Здравствуйте
При изучении Ассемблера по книге "Ассемблер? Это просто! Учимся программировать под MS-DOS" ( Автор: Калашников О. А.) , а именно выпуска № 13 "Как вирус "прикрепляется" к файлу, не нарушая его работоспособно...
Вопрос № 23.737
скажите почяму на masm ver.5.31--1992 ms-dos
Ашибок нету А на tasm Turbo Assembler Version 4.1 Copyright (c) 1988, 1996
ВОТ такая херня:
**Error** start.asm(7) Near jump or call to different CS
**Error** start.asm(9) Near jump or call to different CS
в справочиннике вот така херня????
This error occurs if the user attempts to perform a NEAR CALL or JMP to a symbol that's defined in an area where CS is assumed to a different segment.
!!!compyle masm: ml.exe /FR /AT start.ASM
!!!compyle tasm: tasm start.asm
TLINK.EXE start.obj /t /x
-=--=-=-=-=-=-=-=-=-=-=-=
а мне нужен tasm!
и мне сказал <<КАЛАШНИКОВ>> <-(учим)! сказал что вот НЕ атличяется!
;ИЗВИНИТЕ ЗА ГРАМАТНОСТЬ РУССКИЙ НЕ ИЗУЧЯЛ!
Приложение:
Отправлен: 19.07.2005, 22:00
Вопрос задал: IngineringG (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Евгений Иванов
Здравствуйте, IngineringG!
MODEL tiny
ASSUME cs:CSEG
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 19.07.2005, 22:07
Отвечает: Ayl
Здравствуйте, IngineringG!
Поставь после CSEG segment директиву ASSUME cs:CSEG и будет тебе счастье!
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 20.07.2005, 13:11 Оценка за ответ: 5
Вопрос № 23.739
Добрый день!
Допустим, что в программе встречается строка: buffer equ $. Я прочитал в уроке 009, что при ассемблировании такой строки Ассемблер заменит знак $ на адрес, по которому он расположен. Как выглядит этот адрес (линейный или со смещением )? Если Ассемблер заменяет этот знак на адрес, то почему мы всегда пишем например такую строку mov bx,offset buffer. Зачем в этой строке нужен offset? Ведь offset заносит смещение buffer, получается, что мы заносим в bx смещение адреса? Ну такого же нет смещение адреса! Пожалуйста
объясните как можно подробнее (если можно то с примером адресного пространства). Заранее спасибо за ответ!
Отправлен: 19.07.2005, 22:21
Вопрос задал: Programist (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Евгений Иванов
Здравствуйте, Programist!
никто не пишет так.
где ты это увидел, родной?
писать нужно так
buffer equ $
mov bx, buffer
можно и написать
mov bx, offset buffer
или
lea bx, [buffer]
это как тебе удобно
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 19.07.2005, 22:29 Оценка за ответ: 5
Отвечает: Ayl
Здравствуйте, Programist!
Не путай понятия!
buffer equ $
$ - это текущее смещение в данном сегменте. Когда компилятор транслирует программу, он использует свой счетчик команд (аналог выражения CS:IP процессора). При определении сегмента он сбрасывает смещение этого счетчика в 0 и устанавливает в качестве сегмента имя сегмента или группы. При трансляции каждой команды или данных он увеличивает этот счетчик на длину команды или размер блока данных.
Если ты посмотришь листинг трансляции (см.приложение), то увидишь, что в качестве значения для buffer выступает выражение DGROUP:0107, т.е. для того, чтобы получить смещение, нужно применить директиву OFFSET.
Приложение:
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 20.07.2005, 13:28 Оценка за ответ: 5
Вопрос № 23.743
Здравствуйте уважаемые эксперты,
Мой вопрос касается не столько ассемблера сколько архитектуры процессора – хотелось бы узнать почему процессор использует регистры Ax,Bx, и т.д. А не какие-нибудь другие, то есть почему например регистров именно столько, а не 1000 или 2000, например Ax(1), Ax(2000) и т.д. И вообще насколько эта схема распространенна на другие не IBM процессоры, например те что установлены в калькуляторах, есть ли для них свой собственный ассемблер?
Отправлен: 20.07.2005, 00:28
Вопрос задал: Freshman (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Voituk Alexander
Здравствуйте, Freshman!
Количество регистров обусловлено внутренней архитектурой процессора (созданной в кремнии).
И их число связано с размерами памяти на кристалле и целесообразностью их применения. Т.е. оптимальнное число продумывают разработчики. Зачем иметь 1000 регистров АХ, если для программирования хватает тех, которые есть.
И название их придумали разработчики кристаллов. Для других процессоров (не х86 архитектуры) все по другому. Например, в DEC процессорах были регистры R0 - R7 и система адресации отличалась от Интеловской. Естественно, ассемблер совсем другой. Даже в других Интеловских процах, типа 5051 другие регистры и ассемблер.
И, кстати, это прцессоры не IBM. IBM выпускает свои процессоры, которые совершенно не похожи на Intel.
Ответ отправил: Voituk Alexander (статус: 9-ый класс)
Отправлен: 20.07.2005, 12:15
Отвечает: Ayl
Здравствуйте, Freshman!
Вообще-то, это вопрос к разработчикам.
Но можно предположить, что при меньшем числе регистров требуется меньшее число бит для кодирования регистров, соответственно, остается больше пространства для кодирования кода операции.
Для 8-ми регистров требуется 3 бита, для 16-ти - 4, для 2^k - k бит.
Соответственно, при 8-ми процессорах в одном байте можно использовать:
8 бит для команд без операндов
5 бит для команд с одним операндом в регистре + 3 бита для кодирования регистра
2 бита для команд с 2-мя операндами в регистрах + 6 бит для кодирования 2-х регистров.
В результате, в процессоре может быть использовано достаточно много однобайтовых команд.
Если бы регистров было бы 16, то ситуация выглядела бы так:
8 бит для команд без операндов
4 бита для команд с одним операндом в регистре + 4 бита для кодирования регистра
Двухоперандные команды уже не могли бы быть заколированы в одном байте.
Насчет именования регистров... Это исключительно проблемы разработчиков ассемблера, а не процессора. Процессор не работает с именами, он работает с кодами.
В принципе, можно написать такой компилятор для x86, который будет использовать другие имена для регистров. Хоть номерные (R0, R1 и т.д., как в Мотороле). Главное, чтобы он их правильно переводил в коды процессора.
Для любого процессора есть свой язык ассемблера. Точнее, язык машинных команд. Язык ассемблера - это просто мнемоническое описание машинных команд плюс некоторые конструкции для облегчения работы программиста (метки, имена переменных, структуры и т.п.).
Любой процессор имеет свой набор команд. Если для этого набора команд придумать мнемонические имена, то ты получишь язык ассемблера.
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 20.07.2005, 14:44
Вопрос № 23.759
Здравствуйте
При изучении Ассемблера по книге "Ассемблер? Это просто! Учимся программировать под MS-DOS" ( Автор: Калашников О. А.) , а именно выпуска № 13 "Как вирус "прикрепляется" к файлу, не нарушая его работоспособности? Что должен сделать вирус в первую очередь? Как передать управление вирусу из чужой программы? Работа с DTA. Функции 4Eh и 4Fh прерывания 21h: поиск файлов." у меня возник вопрос. Я сассемблировал программку, а верннее часть программы - инициализацию вируса, при этом поменяв
местами объявление переменных Seg_move и Off_move и запутив в отладчике программу заметил, что не происходит переход в нужный сегмент памяти(BF00h). Вместо этого программа переходит в сегмент 068Eh. Почему критична очередность объявления переменных Seg_move и Off_move?
Приложение:
Отправлен: 20.07.2005, 12:36
Вопрос задал: Denis (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: Ayl
Здравствуйте, Denis!
Потому что используется команда jmp dword ptr cs:[Off_move]. А она предполагает, что по этому адресу будет находится двойное слово, которое указывает адрес перехода.
Но двойное слово в памяти располагается так, что младший байт находится по младшему адресу. И младшее слово тоже. А младшее слово адреса перехода и есть смещение. Поэтому смещение (Off_move) должно быть расположено непосредственно перед сегментом (Seg_mov).
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 20.07.2005, 14:49