помогите нубу
программка рисует пять окошек одно в другом.нужно зациклить процедуру с помощью стека.файл .сом создаётся в DEBUGе.
код
.....
mov ch,05
mov cl,10
.....
int 10
mov cx,0004
:0117 call 011e
loop 0117
int 20
:011e
....
add ch,01
add cl,01
.....
int 10
ret
спасибо
Also, что понимается под этим самым "с помощью стека"?
Это просьба о написании рекурсивной процедуры?
Да и вообще, подробности, подробности, господа.
пардон.подробности в том,что можно четыре call подряд поставить и всё работает,рисует 5 окон.но если эти вызовы зациклить,счётчик циклов использует регистр cx,используемый для координат окна(все РОН заполняются).по идее эти значения cx можно сохранять в стеке,когда нужно-вытащить.ещё call сохраняет в стеке адрес следующей команды.в этом запара.понимаю,что доставляет, но тем не менее
Pop cx/Pus cx. Вообще, есть необходимость в подпрограмме значения помещать в регистр? Если нет прироста в производительности, то стоит использовать локальные переменные на стеке.
в подпрограмме не получится.ret считывает верхушку стека и зашлёт не туда.где же втолкнуть и вытолкнуть переменные(значения координат,кол-во циклов),не забывая,что call тоже толкает в стек?не работает!много вариантов попробовал.это задачка из учебника,а ответа нет
Код:
mov ecx, 5
loop1:
;push ecx тоже никто не мешает делать
call Proc1
;pop ecx но это как-то нехорошо
loop loop1
Proc1 proc
push xcoord
push ycoord
push otherArgs
call DrawWindow
ret 12 ;число - размер положенного в стек. если функция сама за собой не очистила стек
ret ;если функция очищает за собой стек
loop1:
;push ecx тоже никто не мешает делать
call Proc1
;pop ecx но это как-то нехорошо
loop loop1
Proc1 proc
push xcoord
push ycoord
push otherArgs
call DrawWindow
ret 12 ;число - размер положенного в стек. если функция сама за собой не очистила стек
ret ;если функция очищает за собой стек
спасибо конечно.но слабать это нужно мнемокодами в отладчике(debug).до ассемблера мне ещё далеко
Какой отладчик?
Цитата: in_utile
до ассемблера мне ещё далеко
Что между машинным кодом и ассемблером ещё чтото появилось?
Из вашего примера следует что вы пишете на ассемблере. А что там за "мнемокоды" не подскажите?
Интересный выбор "среды разработки".
Цитата: QWERYTY
Я правильно понял, вы пишите в программке DEBUG которая входит в состав виндовс?
Интересный выбор "среды разработки".
Интересный выбор "среды разработки".
И пишет опкодами. :)
[Offtop]НЯП,просто у него задание такое.Удивительно,что в наше время этим ещё мучают кого-то[/Offtop]
код
xor al,al
mov bh,10
mov ch,05
mov cl,10
mov dh,10
mov dl,3e
mov ah,06
int 10
mov cx,0004
0113 call 011a
loop 0113
int 20
011a add bh,10
add ch,01
add cl,01
sub dh,01
sub dl,01
int 10
ret
если не зацикливать вызов процедуры,а тупо четыре calla записать-пашет.счётчик циклов использует регистр сх,значит(по идее) сохраняю переменные в стеке.где же pushи и popы вставить?пробую,трассирую-высираю кирпичи
proc_superproc:
pushad
pushfd
........
popfd
popad
ret
вызов 4 раза в цикле :
mov ecx,4
call_cicle:
call proc_superproc
loop call_cicle