Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задачка, от которой голова кругом 
:(
    Опции темы
shlyuz
  Дата 27.7.2006, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

:0100 XOR AL,AL 
:0102 MOV BH,10 
:0104 MOV CH,05 
:0106 MOV CL,10 
:0108 MOV DH,10 
:010A MOV DL,3E 
:010C MOV AH,06 
:010E INT 10 
:0110 MOV CX,0004 
:0113 CALL 011A 
:0116 LOOP 0113 
:0118 INT 20 
:011A ADD BH,10 
:011D ADD CH,01 
:0120 ADD CL,01 
:0123 SUB DH,01 
:0126 SUB DL,01 
:0129 INT 10 
:012B RET

Автор предлагает предлагает выкрутиться(CX, использованный в качестве "счетчика" циклов, "перебивает" тот же CX, но используемый как "координаты верхнего левого угла окна".) из сложившейся ситтуации с использованием стека.

Задача взята с http://wasm.ru/article.php?article=1022001#p1_10 пункт 4

как smile непойму smile  
PM MAIL   Вверх
S.A.G.
Дата 27.7.2006, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



шарил бы асму - помог бы  smile

P.S. Голова кругом от рекурсии  smile 

Это сообщение отредактировал(а) main - 27.7.2006, 02:40


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
ds29
Дата 27.7.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



shlyuz, что именно не понятно?

p.s. логичней обсуждать это на их форуме 
PM MAIL   Вверх
Akina
Дата 27.7.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



При помощи стека? да нафига?

Код

XOR AL,AL 
MOV BH,10 
MOV CH,05 
MOV CL,10 
MOV DH,10 
MOV DL,3E 
MOV AH,06 
INT 10 
MOV SI,CX ; Задействовать доп. регистр
MOV CX,0004 
Repeat:
CALL MyProc
LOOP Repeat
INT 20 

MyProc PROC NEAR
XCHG SI,CX ; Использовать доп. регистр
ADD BH,10 
ADD CH,01 
ADD CL,01 
SUB DH,01 
SUB DL,01 
INT 10 
XCHG SI,CX ; Восстановить
RET
MyProc ENDP
  


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
rsm
Дата 27.7.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(main @  27.7.2006,  04:39 Найти цитируемый пост)
P.S. Голова кругом от рекурсии

Где это ты там рекурсию усмотрел? smile

shlyuz, непонятно как со стеком этот код сделать что ли? 
PM MAIL   Вверх
shlyuz
Дата 27.7.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



rsm дорогой, не понятно, ну хоть намекни а уж дальше я сам smile  
PM MAIL   Вверх
rsm
Дата 27.7.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

    xor al,al
    mov bh,10h
    mov ch,05
    mov cl,10h
    mov dh,10h
    mov dl,3Eh
    mov ah,06
    int 10h
    mov cx,0004
_0113:
    call _011A
    loop _0113
    int 20h
_011A:
    push cx    ; зашли в функцию - сохранили cx в стеке
    add bh,10h
    add ch,01
    add cl,01
    sub dh,01
    sub dl,01
    int 10h
    pop cx    ; вышли из функции - восстановлили cx из стека
    ret

Прямоугольнички разноцветные рисует - забавная штука smile  

Это сообщение отредактировал(а) rsm - 27.7.2006, 20:49
PM MAIL   Вверх
S.A.G.
Дата 28.7.2006, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Цитата(rsm @ 27.7.2006,  13:19)
Цитата(main @  27.7.2006,  04:39 Найти цитируемый пост)
P.S. Голова кругом от рекурсии

Где это ты там рекурсию усмотрел? smile

Нигде. smile То просто привел сравнение.  

Это сообщение отредактировал(а) main - 28.7.2006, 00:25


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
shlyuz
Дата 28.7.2006, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(rsm @ 27.7.2006,  20:40)
Прямоугольнички разноцветные рисует - забавная штука smile

Прошу прощения, вот первоночальный код программы:
Код

:0100 XOR AL,AL  ;первое окошко рисуем, как и раньше...
:0102 MOV BH,10 
:0104 MOV CH,05 
:0106 MOV CL,10 
:0108 MOV DH,10 
:010A MOV DL,3E 
:010C MOV AH,06 
:010E INT 10 
:0110 CALL 011E  ;четыре раза вызываем подпрограмму, 
:0113 CALL 011E  ;начинающуюся по адресу 011E
:0116 CALL 011E 
:0119 CALL 011E 
:011C INT 20     ;выход из программы...
:011E ADD BH,10  ;начало процедуры
:0121 ADD CH,01 
:0124 ADD CL,01 
:0127 SUB DH,01 
:012A SUB DL,01 
:012D INT 10 
:012F RET        ;конец процедуры 

Надо замениить CALL'ы на LOOP. Типа четыре цикла, и должно получиться окошко в окошке, а у тебя какой-то каскад получается!
0110 MOV CX,0004(смотри свой код) сколько циклов надо выполнить команде LOOP, а ты к нему координаты левого верхнего угла прибавляешь.
Тут какое-то другое решение smile

Добавлено @ 05:03 
Цитата(Akina @ 27.7.2006,  13:17)
При помощи стека? да нафига?

А вот поставлено условие через стек.
Кстати что  делает эта команда - XCHG SI,CX
PM MAIL   Вверх
rsm
Дата 28.7.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

    xor al,al
    mov bh,10h
    mov ch,5
    mov cl,10h
    mov dh,10h
    mov dl,3Eh
    mov ah,6
    int 10h
    enter 4,0        ; выделили в стеке 4 байта под переменные
    mov [bp-2],cx    ; сохранили исходный сх (координаты) в стеке
    mov cx,4
_loop:
    mov [bp-4],cx    ; сохранили сх (счетчик) в стеке
    mov cx,[bp-2]    ; восстановили сх (координаты) из стека
    call _draw
    mov [bp-2],cx    ; сохранили сх (координаты) в стеке
    mov cx,[bp-4]    ; восстановили сх (счетчик) из стека
    loop _loop
    leave            ; очистили стек от переменных
    ret
_draw:
    add bh,10h
    add ch,1
    add cl,1
    sub dh,1
    sub dl,1
    int 10h
    ret

Если что не так, поправьте plz. Для меня DOS умер еще 9 лет назад, так что пишу чисто по интуиции.

Цитата(shlyuz @  28.7.2006,  06:51 Найти цитируемый пост)
делает эта команда - XCHG SI,CX?

Вообще, на подобный вопрос следовало бы ответить "RTFM!" smile
Команда xchg производит обмен значений регистра с регистром или регистра с переменной. Например, после выполнения команды xchg si,cx в si будет значение, содержавшееся в cx; а в cx будет значение, содержавшееся в si
PM MAIL   Вверх
Akina
Дата 28.7.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(shlyuz @  28.7.2006,  05:51 Найти цитируемый пост)
А вот поставлено условие через стек

Ну стек так стек...

Код

XOR AL,AL 
MOV BH,10 
MOV CH,05 
MOV CL,10 
MOV DH,10 
MOV DL,3E 
MOV AH,06 
INT 10 
Push CX ; Сохранить СХ с координатами в стеке
MOV CX,0004 
Repeat:
CALL MyProc
LOOP Repeat
POP CX ; Восстановить корординаты из стека
; Вот только нафига это нужно? а для обучения полезно...
INT 20 

MyProc PROC NEAR
Push BP ; Сохранить ВР в стеке - мы его попортим
Mov BP,SP ; Поместить в ВР адрес макушки стека
; Тогда по адресу [BP-2] - сохраненное значение ВР
; по адресу [BP-4] - адрес возврата из процедуры
; по адресу [BP-6] - сохраненное значение координат
Push CX ; Сохранить СХ со счетчиком в стеке
Mov CX,[BP-6] ; Восстановить значение координат
ADD BH,10 
ADD CH,01 
ADD CL,01 
SUB DH,01 
SUB DL,01 
INT 10 
Mov [BP-6],CX ; Сохранить пересчитанное значение координат
POP CX ; Восстановить значение счетчика
POP BP
RET
MyProc ENDP

Теперь видишь бредоватость использования стека в данном случае?  


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
rsm
Дата 28.7.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Akina, маленькая поправка: не [BP-6], а [BP+4] 
PM MAIL   Вверх
Akina
Дата 28.7.2006, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



rsm, ну да... на коленке же пишу... 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

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

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

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


 




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


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

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