Анончики, помогите решить лабу на ассемблере. Ничего не понимаю.Вылезает ошибка integer overflow при делении. Как исправить? Или что надо переписать, чтобы решить эту систему?
>>219887579#include <iostream>short CalcExp(short a, short b, short p){short Ans;_asm{mov dx, amov bx, bmov cx, pxor ax, ax // очищаем регистр ax//Начало цикла для промежутка[a, b] с шагом pstart : cmp dx, bxjg m1 // если a > b, то перейти на метку m1 иначе выполнить следующую командуcmp dx, -1jl m2 // если x < -1, то вычисляется значение функции y=a/(x+1) иначе y=3-xmov bx, dx // временно помещаем значение dx в bxmov dx, 3sub dx, bxadd ax, dxmov dx, bx // восстанавливаем значение dxmov bx, b // восстанавливаем значение bxadd dx, cx // изменяем шаг аргумента x + pjmp startm2 : mov bx, dx // временно помещаем значение dx в bxadd dx, 1mov bx, dxdiv dxadd ax, dxmov dx, bx // восстанавливаем значение dxmov bx, b // восстанавливаем значение bxadd dx, cx // изменяем шаг аргумента x + pjmp start // конец циклаm1 : mov Ans, ax // возвращаем результат суммы функций}return Ans;}int main(){setlocale(LC_CTYPE, "rus"); // вызов функции настройки локалиstd::cout « "Ответ - "; //Вывод результата работы методаstd::cout « CalcExp(-2, 2, 1); // считает на отрезке [-2;2] с шагом 1}
ОП, ты хорошо понимаешь команду div?Делимое помещается в dx:ax пару.Div dx выглядит очень подозрительно.Сейчас скину пруфы.Мимо плисовод.
>>219888369Отчисляться из-за одной лабы на ассемблере по предмету, которой практически никак не связан с этим языком - ну хз. Вообще непонятно как впихнули ассемблер в мою дисциплину, видимо просто, чтобы было. Все наше изучение ассемблера - это две лабы.
>>219888369двачуюhttps://www.tutorialspoint.com/assembly_programming/assembly_arithmetic_instructions.htm
>>219889169Нет, пару dx:ax ты будешь делить на то, что укажешь в div XX, поэтому перетащи делитель в другой регистр, обнули dx и потом делиСкажем, перемести делитель из dx в bx, и тогда div bx
>>219888996Ну я бы лучше бы ассемблер дрочил чем с отчетами мучался, благо то что позволяет головушка ещё думать
>>219888808Отучился в колледже на 09.02.01. Изучали такое, Ассемблер, паскаль, программирование микроконтроллеров, в общем там залупа полная. Сейчас кстати получаю высшее по 09.03.02, у нас такого нет, возможно потом появится, а возможно и нет, так как ускоренное обучение 3.5 года. собсна год уже отучился.
m2 : mov bx, dx // временно помещаем значение dx в bxadd dx, 1mov bx, dx <--- тут ты свое временное значение стер
>>219880940 (OP)Сучка, сперва научись формулировать вопрос. Ты даже не сказал под какой именно ассемблер тебе надо это сделать?Если кто-то потратит время и напишет код скажем под C51, тебе это поможет??Мразина, пошёл нахуй ибо не ценишь чужое время.
>>219888165На вычислительноой технике тоже учат.>>219889169Нене. В ассемблере деление довольно нестандартно. Там зависит от того, каким размером ты делишь. Если ты будешь делить 8 битовым( к примеру bl bh), то результаты запишутся в al:ah (реpульат в al а остаток в ah). А если 16 бит( bx)то резултат запишется в dx:ax.
Анон, объясни алгоритм.y=a/(x+1)Какой регистр у тебя содержит какую переменную и что означает y. Я так понимаю, это вычмат? y - a - x -
>>219889416>>219889232Таким образом? Ответ вроде должен быть 12.Пожалуйста, не бейте только меня за мой аутизм.
>>219890064Нужно найти решение системы на отрезке от [-2; 2] с шагом р = 1.dx это а, dx +1 это собственно х. По итогу он мне должен считать суммы решений системы на этом промежутке. В ответе 12 должно быть. Или я точно аутист.
>>219880940 (OP)Нихуя себе ты пытаешься разобраться в этом говне, я все лабы по асемблеру спиздил в своё время, сейчас чилю стек java+js(react,redux), зп 120.
>>219884145Операция перемещения значения переменной в регистр с указанным адресом.>>219883782На направлениях, связанных с автоматизацией, такие лабы обязательно встречаются. И чистый Си ещё, указатели и тернарные операторы во все поля.
>>219890398Давай подробно распиши. Есть a, b, p. Какие действия нужно сделать, чтобы получить результат.У тебя путаница сейчас, поэтому распиши словами алгоритм без ассемблера, чисто формулами, как в комментах, только понятнее.Я вычмат не помню уже. С тебя формулы, с меня ассемблер. Давай.
>>219888808>Нас такому кстати не учат, а было бы крутоПроблема асм в том, что он под каждую архитектуру свой. Словом нахуй не нужен. Есть лишь книжка калашникова, но там 16бит, которые нигде банально не запустятся. Годного гайда по 64 битам нет
>>219889927Нам просто скинули эти задания, ничего не объясняя, и никаких лекций по ассемблеру у нас не было, самостоятельно в этом разобраться я не нахожу в себе сил. Преподу тоже не напишешь, он уже месяц не появляется в электронной универовской системе. А все знакомые погромисты 300кк как видят ассемблер чуть ли не в бан кидают.
>>219890558Двачую, лол.На всю группу ну может человека два пытались в этом разобраться, остальные просто приходили сдавать лабы, доставшиеся от старшего курса.
>>219891068а - это начало промежутка, то есть -2.b - конец промежутка, то есть 2.p - шаг равный 1. То есть сначала у нас х = а = -2. Потом прибавляем к нему шаг 1, получается х = -1. И так то конца промежутка. То есть последний х = 2.Сначала мы берем х = -2 и проверяем первое условие системы x<-1. Так для х = -2 это условие выполняется, то считаем y = a/(x+1). Дальше берем х = -1. Первое условие x < -1 не выполняется, значит считаем по второму уравнению у = 3 - х. И так до х = 2. В конце мы должны сложить сумму значений у и вывести её. По моим подсчетам это 12.
>>219891427>>219891652>>219891797"Программа, которое вычисляет сумму значений функции, заданной системой уравнений для аргумента, изменяющегося в диапазоне [-2, 2] c шагом 1.В программе должен быть предусмотрен ввод значений переменных в допустимых границах."
>>219880940 (OP)Забавно. Мы в универе 2 семестра прогали микроконтроллеры (STM32), но делали это на С. Языка Ассемблера даже не касались. Нахуй он нужон?
>>219890870>И чистый Си ещё, указатели и тернарные операторы во все поляСтоп нахуй, это где-то НЕ встречается? выпускник ПМИ
>>219891158У нас было ещё хлеще. Год кидали лабы по ассемблеру, практически ничего не обьясняя. А на следющий год обьясняли ассемблер. Охуенно. Благо я ассемблером практически сразу заинтересовался и начал учить.
>>219880940 (OP)Ты прям, как маленький.Напиши на С и скомпилируй gcc с флагом чтоб он высирал ассемблерный листинг.
>>219880940 (OP)ax,bx и даже нет намеков на использования FPU ну и конечно xmm(sse) , AVX . Прям ностальгия в школьные годы попал 90х. И где то в сторонке урчит мой флопи дисковод на 5 дюймов установленный в ПК 286 . ЭХ
>>219892005У меня не было вот указателей практически. И чистого Си так себе было. Тернарные были, да. Зато были нейронные сети, да.
>>219892539Ну, с учётом того что 90% выпускников моей группы работают как раз таки>java+js(react,redux), только без явы, то мало кто, думаю , жалеет об этом.
>>219892133>Благо я ассемблером практически сразу заинтересовался и начал учитьБлять, а чему там учиться? Синтаксис, набор инструкций, вбил в голову, что вместо if делаешь cmp и джамп к лейблу после кода внутри if и что while (x < a) теперь нужно ебашить лейблы и делать jl по лейблу - и вперед.
>>219890107Было пару ошибок, вроде, но крч вот тебе код от того анона, который не очень в асм#include <iostream>short CalcExp(short a, short b, short p){ short Ans; _asm { mov dx, a // x mov bx, b mov cx, p xor ax, ax // очищаем регистр ax, ans will be here push ax // store ans on the stack start: // Начало цикла для промежутка[a, b] с шагом p cmp dx, bx jg m1 // если a > b, то перейти на метку m1 иначе выполнить следующую команду cmp dx, -1 jl m2 // если x < -1, то вычисляется значение функции y=a/(x+1) иначе y=3-x // y = 3 - x push dx // save current x mov bx, 3 sub bx, dx // bx = 3 - x pop dx // restore x pop ax // get result to ax add ax, bx // move result there push ax // save result mov bx, b // восстанавливаем значение bx add dx, cx // изменяем шаг аргумента x + p jmp start // y = a / (x + 1) m2 : push dx // save current x add dx, 1 // x + 1 mov bx, dx // bx = x + 1 mov dx, -1 // dx = 0xFFFF, из-за того, что у тебя пара dx:ax должно быть отрицательным числом mov ax, a idiv bx // ax = a / bx pop dx // restore current x pop bx // get answer to bx add bx, ax // update answer push bx // save answer mov bx, b // восстанавливаем значение bx add dx, cx // изменяем шаг аргумента x + p jmp start // конец цикла m1 : pop ax // get answer to ax mov Ans, ax // возвращаем результат суммы функций } return Ans;}int main(){ setlocale(LC_CTYPE, "rus"); // вызов функции настройки локали std::cout << "Ответ: "; //Вывод результата работы метода std::cout << CalcExp(-2, 2, 1); // считает на отрезке [-2;2] с шагом 1}
>>219893448Попытка №2#include <iostream>short CalcExp(short a, short b, short p){short Ans;_asm{mov dx, a // xmov bx, bmov cx, pxor ax, ax // очищаем регистр ax, ans will be herepush ax // store ans on the stackstart: // Начало цикла для промежутка[a, b] с шагом pcmp dx, bxjg m1 // если a > b, то перейти на метку m1 иначе выполнить следующую командуcmp dx, -1jl m2 // если x < -1, то вычисляется значение функции y=a/(x+1) иначе y=3-x// y = 3 - xpush dx // save current xmov bx, 3sub bx, dx // bx = 3 - xpop dx // restore xpop ax // get result to axadd ax, bx // move result therepush ax // save resultmov bx, b // восстанавливаем значение bxadd dx, cx // изменяем шаг аргумента x + pjmp start // y = a / (x + 1)m2 : push dx // save current xadd dx, 1 // x + 1mov bx, dx // bx = x + 1mov dx, -1 // dx = 0xFFFF, из-за того, что у тебя пара dx:ax должно быть отрицательным числомmov ax, a idiv bx // ax = a / bxpop dx // restore current xpop bx // get answer to bxadd bx, ax // update answerpush bx // save answermov bx, b // восстанавливаем значение bxadd dx, cx // изменяем шаг аргумента x + pjmp start // конец циклаm1 : pop ax // get answer to axmov Ans, ax // возвращаем результат суммы функций}return Ans;}int main(){setlocale(LC_CTYPE, "rus"); // вызов функции настройки локалиstd::cout << "Ответ: "; //Вывод результата работы методаstd::cout << CalcExp(-2, 2, 1); // считает на отрезке [-2;2] с шагом 1}
>>219893988Да без проблем, самому нравится мучиться с асмСпасибо >>219888635 и >>219892600 за подсказки
>>219887579#include <iostream>short CalcExp(short a, short b, short p){short Ans;_asm{mov dx, amov bx, bmov cx, pxor ax, ax // очищаем регистр ax//Начало цикла для промежутка[a, b] с шагом pstart : cmp dx, bxjg m1 // если a > b, то перейти на метку m1 иначе выполнить следующую командуcmp dx, -1jl m2 // если x < -1, то вычисляется значение функции y=a/(x+1) иначе y=3-xmov bx, dx // временно помещаем значение dx в bxmov dx, 3sub dx, bxadd ax, dxmov dx, bx // восстанавливаем значение dxmov bx, b // восстанавливаем значение bxadd dx, cx // изменяем шаг аргумента x + pjmp startm2 : mov bx, dx // временно помещаем значение dx в bxmov cx, ax // временно помещаем результат в cx, потому что div помещает результат в dx:axadd bx,1 // bx=x+1mov ax, a //a младшее словоxor dx, dx //a старшее слово, нольdiv bx // a/(x+1) результат деления в ax, а остаток в dxsub bx,1 // возвращаем в bx = xadd ax, cx // возвращаем результат в ax и добавляем результат деленияmov cx, p // возвращаем шагmov dx, bx // восстанавливаем значение dxmov bx, b // восстанавливаем значение bxadd dx, cx // изменяем шаг аргумента x + pjmp start // конец циклаm1 : mov Ans, ax // возвращаем результат суммы функций}return Ans;}int main(){setlocale(LC_CTYPE, "rus"); // вызов функции настройки локалиstd::cout « "Ответ - "; //Вывод результата работы методаstd::cout « CalcExp(-2, 2, 1); // считает на отрезке [-2;2] с шагом 1}Вот, можно оптимизировать, но я старался минимально изменить твой код.
>>219880940 (OP)деление уебанскоеты если делишь дели на байт а не на 2 байта, твои супер большие числа туда должны залезтьи делимое должно быть в axи дели с помощью idiv раз все signedс add dx,1 вместо inc dx вообще обмяк в голосхоть бы стаком пользовался смотреть больно блять
>>219894506Если он брал чисто твой код, то у тебя формула, вроде, неверная для того, чтобы считать a/(x+1), я на всякий случай переписал то, где был неуверен
>>219892940Процедуры, макросы, скорость работы различных команд( да мы это тоже почему то начали учить), адрессация, память. Согласен, основы изучить несложно, но и ведь большинство студентов не самые умные.
>>219895205>>219887579#include <iostream>short CalcExp(short a, short b, short p){short Ans;_asm{mov dx, amov bx, bmov cx, pxor ax, ax // очищаем регистр ax//Начало цикла для промежутка[a, b] с шагом pstart : cmp dx, bxjg m1 // если a > b, то перейти на метку m1 иначе выполнить следующую командуcmp dx, -1jl m2 // если x < -1, то вычисляется значение функции y=a/(x+1) иначе y=3-xmov bx, dx // временно помещаем значение dx в bxmov dx, 3sub dx, bxadd ax, dxmov dx, bx // восстанавливаем значение dxmov bx, b // восстанавливаем значение bxadd dx, cx // изменяем шаг аргумента x + pjmp startm2 : mov bx, dx // временно помещаем значение dx в bxmov cx, ax // временно помещаем результат в cx, потому что div помещает результат в dx:axadd bx,1 // bx=x+1mov ax, a //a младшее словоxor dx, dx //a старшее слово, нольcmp ax, 0 //если a < 0jge pos_valmov dx,-1 // то dx =0xFFFFpos_val:idiv bx // a/(x+1) результат деления в ax, а остаток в dxsub bx,1 // возвращаем в bx = xadd ax, cx // возвращаем результат в ax и добавляем результат деленияmov cx, p // возвращаем шагmov dx, bx // восстанавливаем значение dxmov bx, b // восстанавливаем значение bxadd dx, cx // изменяем шаг аргумента x + pjmp start // конец циклаm1 : mov Ans, ax // возвращаем результат суммы функций}return Ans;}int main(){setlocale(LC_CTYPE, "rus"); // вызов функции настройки локалиstd::cout « "Ответ - "; //Вывод результата работы методаstd::cout « CalcExp(-2, 2, 1); // считает на отрезке [-2;2] с шагом 1}Попробуй
>>219896099jge - jump if greater or equalТам dx нужно ставить в 0 если a >= 0, в 0xffff если меньше 0.Это проверка знака.
Если еще кто-то не ушел, подскажите, как впихнуть три условия? Правильный ответ 66. Промежуток и шаг тот же.
>>219895205>>219887579#include <iostream>short CalcExp(short a, short b, short p){short Ans;_asm{mov cx, axor bx, bx // очищаем регистр ax//Начало цикла для промежутка[a, b] с шагом pstart : cmp cx, bjg m1 // если a > b, то перейти на метку m1 иначе выполнить следующую командуcmp cx, -1jl m2 // если x < -1, то вычисляется значение функции y=a/(x+1) иначе y=3-xadd bx,3sub bx,cxadd cx, p // изменяем шаг аргумента x + pjmp startm2 : add cx,1 // cx=x+1mov ax, a //a младшее словоxor dx, dx //a старшее слово, нольcmp ax, 0 //если a < 0jge pos_valmov dx,-1 // то dx =0xFFFFpos_val:idiv cx // a/(x+1) результат деления в ax, а остаток в dxsub cx,1 // возвращаем в cx = xadd bx, ax // добавляем результат деления к сумме в bxadd cx, p // изменяем шаг аргумента x + pjmp start // конец циклаm1 : mov Ans, bx // возвращаем результат суммы функций}return Ans;}int main(){setlocale(LC_CTYPE, "rus"); // вызов функции настройки локалиstd::cout « "Ответ - "; //Вывод результата работы методаstd::cout « CalcExp(-2, 2, 1); // считает на отрезке [-2;2] с шагом 1}Вот, упростил. Если заработает, то это будет понятнее.
>>219896970>>219895205>>219887579#include <iostream>short CalcExp(short a, short b, short p){short Ans;_asm{mov cx, axor bx, bx // очищаем регистр bx//Начало цикла для промежутка[a, b] с шагом pstart : cmp cx, bjg m1 // если a > b, то перейти на метку m1 иначе выполнить следующую командуcmp cx, 0jl m2je m3add bx,5add bx,cxadd cx, p // изменяем шаг аргумента x + pjmp startm3:add bx, 54add cx, p // изменяем шаг аргумента x + pjmp startm2 :add bx,a sub bx, cxadd cx, p // изменяем шаг аргумента x + pjmp start // конец циклаm1 : mov Ans, bx // возвращаем результат суммы функций}return Ans;}int main(){setlocale(LC_CTYPE, "rus"); // вызов функции настройки локалиstd::cout « "Ответ - "; //Вывод результата работы методаstd::cout « CalcExp(-2, 2, 1); // считает на отрезке [-2;2] с шагом 1}