FASM, org, jbe и метки

Тема в разделе "WASM.ASSEMBLER", создана пользователем AndreyMust19, 19 дек 2010.

  1. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Код (Text):
    1. int7_addr equ 10000h
    2.  
    3. org 0xFFFF0
    4. jmp 1100:0000h
    5.  
    6. use16
    7. org int7_addr
    8. int7:
    9.  push bx
    10.  clc
    11.  cmp al, ah
    12.  jbe m4
    13.  mov al, ah
    14. m4:
    15.  mov bl, ah
    Пишет ivalid value на строчке с jbe m4.
    До указания директив org все работало.
    И так со всеми метками.
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    AndreyMust19
    У вас в программе используется 16-битный режим
    Адреса меток вычисляются по формуле $$+$ где $$ указывается в директиве org, а $ определяется из текущего смещения в тексте исходника, но адрес 0xFFFF0 не поместится в 16-бит, а следовательно и адреса всех меток будут не правильными
    Если вы все же хотите использовать hma, то попробуйте сделать так
    org 0
    jmp 0xFFFF:@f
    @@:
     
  3. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    А как записать адрес в org в виде сегмент:смещение?
    Код (Text):
    1. org 1000:0000h ; не принимает
    Или эта директива принимает только линейный адрес?
    Надо расположить код в памяти выше 64 Кб (н-р, 1000:0000h), но при этом оставить код 16-тиразрядным.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AndreyMust19
    Располагайте и оставляйте. org никакого отношения к линейному адресу в памяти не имеет и вообще здесь не нужен.
     
  5. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Не понял :). Код должен находиться по адресу 10000h. Почему метки не работают? Ведь при передачи управления на код сегмент должен записываться в cs, а при ветвлениях - меняться ip.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AndreyMust19
    Уберите org и будут работать. org указывает предполагаемое смещение базы кода относительно базы сегмента, а не полный адрес.
    Ну вот и располагайте. Компилятор не в силах это сделать. Это можно сделать только в рантайме: явным образом в рамках своего кода или это делается неявно загрузчиком, который у Вас по всей видимости для этого кода отсутствует.
     
  7. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    А разве не должен генерироваться bin-файл размером 11000h слишним байт, в котором пустые места заполнены нулями?
    Может так TASM делает?
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AndreyMust19
    Нет. Не должен. И tasm, насколько я помню, тоже так не делает. Даже при повторном org.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    просто вам надо
    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

    но это опасно (грозит зависанием), если вы выполняетесь под досом. хотелось бы все целиком увидеть
     
  10. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Посмотри мою тему про спецефический вызов, там я код тоже за 1м мегом распологал
     
  11. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    AndreyMust19


    чтоб вы поняли

    запись
    Код (Text):
    1.    .code
    2.    org n
    3.  
    4. Label:
    эквивалентна

    Код (Text):
    1. s segment ...
    2.  BYTE n DUP (?)
    3. label:
    4.  
    5.  
    6. s ends
    если вам надо расположить сегмент в пределах первого мегабайта
    используйте директиву segment at
     
  12. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Это понятно, что org задает адрес расположения в памяти след. команды.
    Непонятно - почему после создания bin-файла он получается маленького размера и не забит нулями между org'ами. Команда org что, игнорируется?

    Насчет адреса в команде org. В описываемой программе со стороны процессора код дублируется в АП в неск. местах. Мне надо было выбрать адрес в пределах первого мегабайта, а не указывать стартовый адрес. Все равно этот адрес спроецировался бы на 0xFFFF0.
    Проблема в том, что препод требовал указать именно физический адрес (выдаваемый процессором, т. е. 0xFFFF0), а не тот, по которому код реально находится в ОЗУ.
     
  13. asmdev

    asmdev New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    12
    Если использовать вашу терминологию, то да "игнорируется". Задача ORG раздатъ правильные адреса меткам, и усё.
    Код (Text):
    1. org 7c00h
    2. label1:
    3.  mov ax, label1  ; ax contains 0x7c00
    4.  jmp  label2       ;jump to 7d00 while there is nothing there
    5. org 7d00h
    6. label2:
    7.  mov ax, label2  ; ax contains 0x7d00
    размер кода 9 байтов

    Код (Text):
    1. org 7c00h
    2. label1:
    3.  mov ax, label1  ; ax contains 0x7c00
    4.  jmp  label2
    5.  rb label2-$ ; fill with 0s
    6. org 7d00h
    7. label2:
    8.  mov ax, label2  ; ax contains 0x7d00
    В 16битном realMode только 16битные значения в ORG. Это будет IP. Потом процессор (во время выполнения кода) возьмёт CS и вычислит CS:IP для меток.

    Нет, не задаёт. Но если комманда использует метки (адреса переменных, прыжки) то комманда выполнится неправилно, с не предсказуемыми результатами.