Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь с командой Call, Нужна помощь с командой Call  
:(
    Опции темы
Trail
Дата 30.4.2010, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.11.2009

Репутация: нет
Всего: нет



Ребята помогите решить вот такую задачку из несколько строчек(Но там где мне надо её решате не совсем assembler а просто программа в ней заложены основы assemblera.:
Нужно сделать цикл с командой call вот в таком виде :
Код

:next
call 0300h    ;помещаем в стек и переходим по адрессу 0300h и там должен быть переход(Но по этому адрессу ничего нет((( 
Как быть?забивать до этого адресса всякой ерундой и на 300 адрессе задать команду ret? Возможно есть и другой способ?  
.........
.........
........

jmp next     ;снова


Это сообщение отредактировал(а) Trail - 30.4.2010, 16:53
PM MAIL   Вверх
iff
Дата 30.4.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



Для чего (какого компилятора или отладчика) пишем?
Для TurboDebuger?
И вообще не понятнго что должно делать программа...


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
Trail
Дата 30.4.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.11.2009

Репутация: нет
Всего: нет



Я мало че знаю об этой программе но это эмулятор для аппаратного программирования.Система команд на ассемблере МП КП580 .Суть лабораторной выяснить на осцилографе как действует команда call с адрессом 0300h.Программа должна осуществлять каманду call следовательно запись в стек и переход на указанный адресс и что-бы было все в цикле.Да только не знаю если должен быть переход на адресс 0300h а пишу я на адрессе 0005h то между ними огромное количество строк и цикл замкнуть не получается т.к. он переходит на этот адресс и дальше начинает переползать. А переход с call должен обезательно осуществлятся на адресс 0300h вот такое хитрое задание(    

Это сообщение отредактировал(а) Trail - 30.4.2010, 19:21
PM MAIL   Вверх
ФедосеевПавел
Дата 30.4.2010, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: нет
Всего: 10



Можно использовать директиву ассемблера org или подобную директиву
Код
 
    org 5
next:
    call 0300h
;-------------------------------
    org 0300h
    ret          ; это лучше, чем jmp next


PM   Вверх
Trail
Дата 30.4.2010, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.11.2009

Репутация: нет
Всего: нет



Павел спасибо за совет.Очень подошел.Вот только команда ret почему-то не возвращает на строку jmp next
Вот листинг.   Кстати если заменить ret на безусловный переход тоже почему-то не действует может у этих двух команд (org и jmp большое расстояние?Но
компилятор не ругается.)

Код

:Стр.   Адрес Код                           Мнемоники                               
---- ------- ----                          ---------                               
0001    0000                               :next
0002    0000 CD 00 03                          call 0300h
0003    0003 C3 00 00                          jmp next 
0004    0006                               ;-------------------------------
0005    0006                                   org 0300h
0006    0300 C9                                ret
0007    0301                               


Вот скрин отладчика
user posted image

Это сообщение отредактировал(а) Trail - 30.4.2010, 21:05
PM MAIL   Вверх
ФедосеевПавел
Дата 30.4.2010, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: нет
Всего: 10



Вообще-то, ret должна возвращать на jmp next. Может, перед call инициализировать указатель стека SP (кажется, ldi sp, xxxx).
PM   Вверх
iff
Дата 1.5.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



Чему бы не ровнялся SP, код приведенный выше должен работать.
Может быть регистр SS указывает не на сегмент стека, а например на область данных ПЗУ BIOS в вершней памяти и соответственно значение не может быть сохранено в этой области...


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
ФедосеевПавел
Дата 1.5.2010, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: нет
Всего: 10



iff, это совсем другой процессор - в нём ещё нет деления на сегменты. Они появятся в следующем поколении...

Trail, я не сразу сообразил как посмотреть изображение отладчика (Opera не открывала сразу)...
По адресу 0300h там нет команды ret. Она почему-то не загрузилась... В этом-то видимо и есть ошибка - там в отладчик загружена совсем другая программа, отличная от описанной в твоём посте от 30.4.2010, 20:42.

Это сообщение отредактировал(а) ФедосеевПавел - 1.5.2010, 19:35
PM   Вверх
Trail
Дата 4.5.2010, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.11.2009

Репутация: нет
Всего: нет



Код

:next
call 0300h
jmp next 
org 0300h ;указатель адресса
mvi d,0
ret


Стр.   Адрес Код                           Мнемоники                               
---- ------- ----                          ---------                               
0001    0000                               :next
0002    0000 CD 00 03                      call 0300h
0003    0003 C3 00 00                      jmp next 
0004    0006                               org 0300h ;указатель адресса
0005    0300 16 00                         mvi d,0
0006    0302 C9                            ret
0007    0303           

В листинге по адресу 0302h стоит шест.символ С9 Как я понял он в память заносит это значение.А когда я смотрю память там нету по адресу 0302h ничего.Зато С9 есть
 в памяти по адресу последнему в коде.
Вот скрин: user posted image
 

Это сообщение отредактировал(а) Trail - 4.5.2010, 11:59
PM MAIL   Вверх
ФедосеевПавел
Дата 6.5.2010, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: нет
Всего: 10



Если это ещё актуально, то приходит ну ум пара вариантов решения.
1. Возможно, ты не полностью разобрался с загрузкой в эмулятор или с параметрами выходного файла компилятора. Т.к. листинг выглядит ожидаемо.
2. Если загрузить в эмулятор нужным образом не представляется возможным - "насильно" загрузить нужные байты по адресу 300h или, разбив программу на две части, в два этапа.
3. Возможно, саму программу следует записать так, чтобы это был непрерывный блок, и ret находился по адресу 300
Код
org 2fah
:next
  call 300h
  jmp next
  ret

Пожалуй, ничего не смогу больше добавить.
PM   Вверх
Trail
Дата 6.5.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.11.2009

Репутация: нет
Всего: нет



Всем большое спасибо.Разобрался.Оказывается надо стек прописать потому-что память очень маленькая и стек в ней теряется.А вообще прокатило без адресса 0300h.Буду мучаться со следующей лабой там прерывание надо проанализировать)))

Это сообщение отредактировал(а) Trail - 6.5.2010, 18:54
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.