CS221. Архитектура компьютера и операционные системы

я указывал c “$”, как в лекциях.

Да, везде $.

Пожалуйста, не надо приводить тут скриншоты всё время. И так всё ясно.

@Ulysses Артем Михайлович, почему просмотр теста недоступен после первой попытки?

@kts Ну тут сверху просили ужесточить правила, вот я и решил попробовать начать жить по-новому — второй модуль как никак!

@Ulysses Артем Михайлович, а апелляции по домашним заданиям принимаете?

Вопрос ведь стоит про инструкцию. Про операнды ни слова.

@Anatolij_I Конечно, принимаю. Переоценил.

@Ulysses Вы говорили, что КР на 15 чистых баллов, а в мудле на 20 стоит, это вы ошиблись или в мудле что-то пошло не так?

@RELICS 15. Спасибо за замечание, исправил.

@Ulysses вопросы по домашнему заданию можно здесь задавать?

Можно попробовать.

В первом задании нужно распечатать 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 совсем неправильно?

как-то длинно получилось :// Но зато я немного разобралась пока писала :sweat_smile:

Нужно отталкиваться от этого варианта. Перед _PRINTF надо положить копию i-го элемента массива (доступ к нему получается с помощью (BP)(SI), где SI должен пробегать значения 6, 8 и т. д.).

Вы не поверите, но это одна из основных идей форума.

Спасибо. А чистить стек от массива в основной программе?

Да, у нас же cdecl: кто положил, тот и чистит.

Ну просто мы же в основной программе положили его туда, до вызова PRINT

Аргументы для печати (копию одного элемента массива, формат и 127) чистятся внутри подпрограммы, конечно.

Ну это да, а та копия массива которая лежит там уже?

«Там уже» — это я не очень понимаю. Первый экземпляр массива складывает в стек вызывающий код («основная программа») — он же должен его убирать после того, как завершится процедура печати. Всё остальное в стеке собирается из-за процедуры печати — она должна сама это убирать.

Ок, спасибо