Member 13477225 Ответов: 1

Как создать цикл с помощью сборки x86 для печати строк звездочек из введенных значений?


Мне удалось напечатать ряд звезд, но когда я пытаюсь напечатать другую строку из нового значения, она создает бесконечный цикл. Он останавливается на 0. Я хочу использовать сборку x86 и использую visual studio.

пример
вход:
1
5
8
0

выход:
*
*****
********

Что я уже пробовал:

код #include "файл stdafx.ч"
#include <stdlib.h>

void printChar(char c);
void printStr(char *strAddr);
void printInt(int someInt);

int numItems; //номер товара
int *items; // указатель на элементы
int anItem; //будет соответствовать количеству видимых звездочек

int wmain(int argc, _TCHAR* argv[])
{
items = (int *)malloc(1000);

numItems = 0;
делать
{
printf("введите элемент %d (0 означает конец данных): ", numItems + 1);
scanf("%d", &anItem);
предметы[numItems] = элемент;
numItems++;

} while (anItem != 0); //для ввода и чтения данных

_ассемблер
{

позвоните в printNewLine

мову Эси [предметы] //Эси указывает на начало 'numItems' ('элементы' указывает на адрес 'numItems')

mainLoop: mov eax, [esi] //eax имеет адрес памяти 'numItems'
мова [элемент], еах //памяти адрес 'элемент' имеет адрес памяти 'numItems'

mov eax, 0
starLoop: push eax //eax first in stack
мов ал, '*'
нажми ал
вызов printChar //печатает один *

pop eax //eax из стека

inc eax //eax увеличивается на 1
СМР еах, [элемент] //значение регистра eax по сравнению с 'элемент'
одна starLoop //если значение не равно значению 'элемент', starLoop опять начинается


отделка jmp

printNewLine:
нажмите '\r' // две строки, чтобы напечатать символ.
вызовите printChar

нажмите '\n' // две строки, чтобы напечатать еще один символ.
вызовите printChar

ret // и обратно в <откуда бы мы ни пришли>

finish : // ничего не делать
}


printf("нажмите enter, чтобы выйти\n");
char dummy[10]; //на всякий случай несколько ключей в буфере
scanf("%c", манекен); //пауза.
scanf("%c", dummy); //снова пауза.
}

void printChar(char c)
{
printf("%c", c); //%c означает как символ

}
void printStr(char *strAddr)
{
printf("%s", strAddr);
}
void printInt(int someInt)
{
printf("%d", someInt);
}

Richard MacCutchan

Вы только что создали новую учетную запись, чтобы повторить то, что вы уже опубликовали пару дней назад? и мы дали вам достаточно предложений, чтобы решить эту проблему. Главное предложение состоит в том, чтобы перестать использовать ассемблер и придерживаться C. Как только вы станете экспертом по си, Вы можете попробовать переключиться на ассемблер.

[no name]

Глупый комментарий "перестань использовать ассемблер и придерживайся языка Си"!
В мире есть люди, которые любят учиться....

Richard MacCutchan

Если у вас нет ничего полезного, чтобы добавить, то, пожалуйста, не заполняйте форумы глупыми комментариями.

[no name]

Тебе того же

Richard MacCutchan

Пожалуйста, либо повзрослей, либо найди какой-нибудь другой форум, чтобы досаждать людям.

[no name]

сухой

[no name]

Я знаю, как это делается в Си. Весь смысл этого заключался в том, чтобы изучить его в сборке x86. Прости, если я чем-то расстроил тебя. Это никогда не входило в мои намерения. Все, что мне было нужно, - это немного помощи, так как я уже испробовал много способов. Еще раз извини, если я сделал что-то не так.

Richard MacCutchan

Ну, несмотря на количество предложений, которые мы вам предоставили, вы все еще, кажется, не продвинулись дальше, чем в первый раз, когда вы опубликовали этот вопрос.

[no name]

Потому что я получил совет сделать это на языке Си и код на языке С. Я упомянул об этом более ясно в следующий раз, когда спросил (я хочу, чтобы это было в сборке), потому что я предположил, что не был ясен. Я не думал о последствиях этого - о том, что мои вопросы будут удалены, прежде чем я смогу даже получить решение, связанное с моей проблемой. Прости, что доставил тебе столько хлопот, когда ты просто помогал. К сожалению, это было не то, что я искал.

Richard MacCutchan

Хорошо, но вы смешиваете очень небольшое количество ассемблерного кода с большим количеством C. чего именно вы пытаетесь достичь?

Никто не пытается бороться с вами, мы просто пытаемся дать совет, чтобы помочь вам исправить ваш код. Но эти форумы-не самое лучшее место для изучения программирования в первую очередь. Есть много учебных пособий и руководств, которые можно найти в поиске google, что было бы более полезным для вас.

[no name]

Я действительно пришел сюда не для того, чтобы ссориться. Было бы полезно, если бы вы попробовали то же самое (похоже, что и вы с моей точки зрения).

1 Ответов

Рейтинг:
1

OriginalGriff

mov esi, [items] //esi points to start of 'numItems' ('items' points to address of 'numItems')
С каких это пор?

Посмотри на свой код. Где items приступайте к работе numitmes?

Со всей серьезностью, если вы хотите изучить ассемблер, то я настоятельно рекомендую вам полностью отказаться от материала c и использовать "чистое" ассемблерное решение. Я бы также предположил, что вам нужен гораздо лучший фон программирования, прежде чем вы даже подумаете об изучении ассемблера, поскольку история ваших вопросов не показывает, что вы думаете о своем собственном коде: вы задаете вопросы, которые любой человек с разумным опытом кодирования должен быть в состоянии решить, даже если он не знает ассемблера!


[no name]

Я не знал, что это превратилось в какое-то место, где люди чувствуют себя глупо? Спасибо за лекции, но обвинять меня в том, что я не могу понять его так, как вы, - это немного подло. Ранее я использовал элементы в качестве указателя на numItems. Спасибо за ваш совет. Я не хотел никого из вас злить, но все, что я получаю, это ответы, заставляющие меня чувствовать себя глупо. Извините, что потратил ваше время и явно показал, насколько я "глуп". (C использовался только в качестве отправной точки)

[no name]

"Я не знал, что это превратилось в какое-то место, где люди чувствуют себя глупо?"
Обычно это не так....
Оставайтесь с нами на некоторое время
Избегайте быть тонкокожим
... Это было то же самое для меня тоже ;)

Это отличный форум, чтобы получить помощь. Просто отфильтруйте часть шума :-)

[no name]

Спасибо за совет. Я чувствую, что получаю одни и те же ответы от одних и тех же людей, которым я явно не нравлюсь.

[no name]

Тот же опыт и здесь. Просто пропустите некоторые комментарии ;)

OriginalGriff

Остановитесь и подумайте о том, что вы задаете в форме вопросов, вместо того чтобы прыгать на своей высокой лошади и предполагать, что мы думаем, что вы идиот, и что мы сердимся. Мы этого не делаем, и мы не являемся (или, по крайней мере, я не являюсь): но ваши вопросы не показывают много доказательств реального мышления, а тем более разумной степени компьютерного опыта. Если бы у вас было это, вы бы не задавали таких вопросов! И когда мы видим "тот же самый чертов код" в четвертый или пятый раз, у нас действительно возникает ощущение, что кто-то берет Микки.

Язык ассемблера сложен: не потому, что его слишком много, а совсем наоборот - он ужасно сложен, потому что его немного: вы должны обрабатывать все сами, за исключением примитивов ОС, чтобы взаимодействовать с оборудованием и, следовательно, с пользователем. Вот почему вы играете с C, чтобы обеспечить некоторые взаимодействия, просто чтобы сделать вашу жизнь проще. Но они не предназначены для этого, поэтому, если вы не защитите свой код от них, вы столкнетесь с такими проблемами, как повреждение регистра, которое у вас было вчера.

Прекратите использовать C в качестве "носителя", чтобы изолировать себя от аппаратного обеспечения, и используйте "правильный" ассемблер: таким образом люди не будут предполагать, что вы пытаетесь изучать C одновременно и отвлекаться. Вы хотите изучить ассемблер? Начать здесь:

https://www.youtube.com/watch?v=9e1ER2o83N0

(Обычно я избегаю учебников YouTube, таких как The plague, но этот на самом деле полезен), а затем получаю копию этого:

https://www.amazon.co.uk/Assembly-Language-X86-Processors-Irvine/dp/013602212X

Это научит вас гораздо большему, чем кажется ваш нынешний подход! :смеяться:

[no name]

Спасибо за помощь :/ просто совет: перечитайте то, что вы печатаете. Просто мне это показалось немного пассивно агрессивным

Richard MacCutchan

Нет, на самом деле это очень здравый совет, от одного из самых опытных экспертов на этом сайте.

[no name]

Спасибо за помощь. Вы также можете удалить этот вопрос. Я чувствую, что теперь это становится бесполезным.

[no name]

Пожалуйста, оставайтесь и продолжайте сборку x86, и не обращайте внимания на бесполезные комментарии.