Да, везде $.
Пожалуйста, не надо приводить тут скриншоты всё время. И так всё ясно.
Да, везде $.
Пожалуйста, не надо приводить тут скриншоты всё время. И так всё ясно.
@kts Ну тут сверху просили ужесточить правила, вот я и решил попробовать начать жить по-новому — второй модуль как никак!
@Ulysses Артем Михайлович, а апелляции по домашним заданиям принимаете?
Вопрос ведь стоит про инструкцию. Про операнды ни слова.@Ulysses Вы говорили, что КР на 15 чистых баллов, а в мудле на 20 стоит, это вы ошиблись или в мудле что-то пошло не так?
Можно попробовать.
В первом задании нужно распечатать N элементов, которые лежат на стеке после N. Моя программа кладет на стек эти элементы, потом N, потом вызывает подпрограмму которая это все должна делать, и на стек кладутся сначала адрес возврата, после команды CALL, потом BP. Если в цикле класть на стек форматную строку, потом _PRINTF, а после вызова чистить его (ADD SP,4), то будет печататься BP. Если перед всем этим на каждой итерации делать ADD SP, 6, чтобы пропустить BP, адрес возврата и N, то подпрограмма печатает то, что нужно, но у меня такое ощущение что так делать нехорошо, и после MOV SP, BP на вершине стека появляется BP, а под ним N кодов _PRINTF, в итоге после RET программа переходит к _PRINTF и завершается с сообщением “Code out of range”, потому что то адрес возврата потерялся. Его нужно где-то отдельно сохранить? или прибавлять 6 к SP совсем неправильно?
как-то длинно получилось :// Но зато я немного разобралась пока писала
Нужно отталкиваться от этого варианта. Перед _PRINTF
надо положить копию i-го элемента массива (доступ к нему получается с помощью (BP)(SI)
, где SI
должен пробегать значения 6, 8 и т. д.).
Вы не поверите, но это одна из основных идей форума.
Спасибо. А чистить стек от массива в основной программе?
Да, у нас же cdecl
: кто положил, тот и чистит.
Ну просто мы же в основной программе положили его туда, до вызова PRINT
Аргументы для печати (копию одного элемента массива, формат и 127) чистятся внутри подпрограммы, конечно.
Ну это да, а та копия массива которая лежит там уже?
«Там уже» — это я не очень понимаю. Первый экземпляр массива складывает в стек вызывающий код («основная программа») — он же должен его убирать после того, как завершится процедура печати. Всё остальное в стеке собирается из-за процедуры печати — она должна сама это убирать.
Ок, спасибо
Так, Манвелян и Завгороднев, вы каждый семестр собираетесь одинаковые задания сдавать? Обнуляю лабораторную и домашнюю #3 обоим. На первый раз. Надеюсь, и последний.