Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Задачка


Автор: shlyuz 27.7.2006, 01:30
Код

: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  

Автор: S.A.G. 27.7.2006, 02:39
шарил бы асму - помог бы  smile

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

Автор: ds29 27.7.2006, 10:59
shlyuz, что именно не понятно?

p.s. логичней обсуждать это на их форуме 

Автор: Akina 27.7.2006, 13:17
При помощи стека? да нафига?

Код

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
  

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

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

shlyuz, непонятно как со стеком этот код сделать что ли? 

Автор: shlyuz 27.7.2006, 20:18
rsm дорогой, не понятно, ну хоть намекни а уж дальше я сам smile  

Автор: rsm 27.7.2006, 20:40
Код

    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  

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

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

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

Автор: shlyuz 28.7.2006, 04:51
Цитата(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? 

Автор: rsm 28.7.2006, 16:51
Код

    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. 

Автор: Akina 28.7.2006, 19:00
Цитата(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

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

Автор: rsm 28.7.2006, 21:01
Akina, маленькая поправка: не [BP-6], а [BP+4] 

Автор: Akina 28.7.2006, 23:15
rsm, ну да... на коленке же пишу... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)