Код (Text): int7_addr equ 10000h org 0xFFFF0 jmp 1100:0000h use16 org int7_addr int7: push bx clc cmp al, ah jbe m4 mov al, ah m4: mov bl, ah Пишет ivalid value на строчке с jbe m4. До указания директив org все работало. И так со всеми метками.
AndreyMust19 У вас в программе используется 16-битный режим Адреса меток вычисляются по формуле $$+$ где $$ указывается в директиве org, а $ определяется из текущего смещения в тексте исходника, но адрес 0xFFFF0 не поместится в 16-бит, а следовательно и адреса всех меток будут не правильными Если вы все же хотите использовать hma, то попробуйте сделать так org 0 jmp 0xFFFF:@f @@:
А как записать адрес в org в виде сегмент:смещение? Код (Text): org 1000:0000h ; не принимает Или эта директива принимает только линейный адрес? Надо расположить код в памяти выше 64 Кб (н-р, 1000:0000h), но при этом оставить код 16-тиразрядным.
AndreyMust19 Располагайте и оставляйте. org никакого отношения к линейному адресу в памяти не имеет и вообще здесь не нужен.
Не понял . Код должен находиться по адресу 10000h. Почему метки не работают? Ведь при передачи управления на код сегмент должен записываться в cs, а при ветвлениях - меняться ip.
AndreyMust19 Уберите org и будут работать. org указывает предполагаемое смещение базы кода относительно базы сегмента, а не полный адрес. Ну вот и располагайте. Компилятор не в силах это сделать. Это можно сделать только в рантайме: явным образом в рамках своего кода или это делается неявно загрузчиком, который у Вас по всей видимости для этого кода отсутствует.
А разве не должен генерироваться bin-файл размером 11000h слишним байт, в котором пустые места заполнены нулями? Может так TASM делает?
просто вам надо mov si, some_code_metka; боюсь писать ptr вдруг возникнут вопросы про сегменты xor di, di push 1000h pop es push cs pop ds mov cx, some_code_size rep movsb jmp 1000h:0000h org 0 some_code_metka: ; this is code running at cs:ip=1000h:0000h линейный адрес будет больше 64 кб=10000h some_code_size=$-some_code_metka но это опасно (грозит зависанием), если вы выполняетесь под досом. хотелось бы все целиком увидеть
AndreyMust19 чтоб вы поняли запись Код (Text): .code org n Label: эквивалентна Код (Text): s segment ... BYTE n DUP (?) label: s ends если вам надо расположить сегмент в пределах первого мегабайта используйте директиву segment at
Это понятно, что org задает адрес расположения в памяти след. команды. Непонятно - почему после создания bin-файла он получается маленького размера и не забит нулями между org'ами. Команда org что, игнорируется? Насчет адреса в команде org. В описываемой программе со стороны процессора код дублируется в АП в неск. местах. Мне надо было выбрать адрес в пределах первого мегабайта, а не указывать стартовый адрес. Все равно этот адрес спроецировался бы на 0xFFFF0. Проблема в том, что препод требовал указать именно физический адрес (выдаваемый процессором, т. е. 0xFFFF0), а не тот, по которому код реально находится в ОЗУ.
Если использовать вашу терминологию, то да "игнорируется". Задача ORG раздатъ правильные адреса меткам, и усё. Код (Text): org 7c00h label1: mov ax, label1 ; ax contains 0x7c00 jmp label2 ;jump to 7d00 while there is nothing there org 7d00h label2: mov ax, label2 ; ax contains 0x7d00 размер кода 9 байтов Код (Text): org 7c00h label1: mov ax, label1 ; ax contains 0x7c00 jmp label2 rb label2-$ ; fill with 0s org 7d00h label2: mov ax, label2 ; ax contains 0x7d00 В 16битном realMode только 16битные значения в ORG. Это будет IP. Потом процессор (во время выполнения кода) возьмёт CS и вычислит CS:IP для меток. Нет, не задаёт. Но если комманда использует метки (адреса переменных, прыжки) то комманда выполнится неправилно, с не предсказуемыми результатами.