Здравствуйте, уважаемые эксперты. Есть простейшая программа, выводит "Hello, World!", вот она:
Код :
.model small
stack 100h
data
msg db 'Hello, World!$'
code
start:
mov ax,@data
mov ds,ax
mov ah,9
mov dx,offset msg
int 21h
mov ax,4c00h
int 21h
end start
Просматривая дамп, получил странную картину(прилагаю): данные идут не с нуля, как в коде, а с некоторым смещением. Проверял на других программах, то же самое. Заметил, что перед данными каким-то образом влезает хвост программы из сегмента кода. Изменил код с упрощенной записи(.model small и т.п.) на классическую - баг изчез. Что бы это могло быть, и можно ли исправить?
Проблема связана с тем, как разработчики компиляторов MASM и TASM смотрят на упрощенные директивы определения сегментов. Оба компилятора одинаково генерируют служебную информацию о сегментах в том числе и о выравниваниии(masm,tasm соответственно):
Но
по разному генерируют код:
Это видно по адресам 0х0000(В8 хх хх) и 0х0007(ВА хх хх). MASM совмещает сегменты данных и кода учитывает выравнивание и сегмент данных начинается с ненулевой позиции текущего параграфа, тем самым
сокращается длина сгенерированого кода. Полная противоположность TASM, сегмент всегда выравнивается на начало параграфа.
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!