Anonymous
https://youtu.be/kPRA0W1kECg
О, да, оно, спасибо что нашел, очень хорошо!
Aiwan \ (•◡•) / _bot
есть еще с танцами
Maksim R.
Разобрался?
К сожалению не до конца
Co(n)stantine👨‍🔬
Я где-то видел видео с визуализацией разных сортировок. Вроде бы елочку сортировали (могу ошибаться)
Есть ещё такое: http://algolab.valemak.com/ https://sadanandpai.github.io/sorting-visualizer/dist/ https://caspervonb.xyz/toneofsorting/
superiority
Нужно закрыть предмет
superiority
Длится один модуль Знаю языки программирования но не ассемблер
⸙ꠋꠋk̹̺ Seymøur
Отличная возможность его выучить как раз
Anonymous
я могу както определить тип устройства на котором я нахожусь на винде?(лептоп, пк, планшет). Может ктото знает какойто рокетсайнс
superiority
Можете помочь как сделать нахождение средне арифметического при получений целочисленного массива
Saenro
Можете помочь как сделать нахождение средне арифметического при получений целочисленного массива
Бежишь по массиву, суммируешь все числа одно за другим, потом сумму этих чисел делишь на количество этих чисел. xor edx, edx xor eax, eax mov esi, array mov ecx, numOfElements mov ebx, ecx next: add eax, [esi+ecx×4-1] loop next div ebx ret ; eax=average Array: dd 1,5,8,3,6,8
Saenro
Угу спасибо большое
Но оно не будет работать с большими числами
superiority
Какие и сколько чисел в массиве?
Размер массива заданный
superiority
Сам массив статичен
­
4 8 15 16 23 42
superiority
Он равен 5
superiority
Сейчас осталось написать в файле myasm.h функцию scanf
Ребята, а поясните за short jump. Можно ли как-то удобно перепрыгивать число инструкций или всегда байты считать для прыжка? Метку ставить не хочу по ерунде.
Saenro
Ребята, а поясните за short jump. Можно ли как-то удобно перепрыгивать число инструкций или всегда байты считать для прыжка? Метку ставить не хочу по ерунде.
short jump прыгает до 128 назад и до 127 вперёд относительно следующей команды, от того и весит всего два байта. Считай если хочешь, но с меткой проще.
Буфферы специально под неё раскладывает.
Гнутый стэк-протектор точно так делает.
Вот так буду делать, наверное https://stackoverflow.com/questions/53128561/anonymous-labels-in-att-assembly
Anonymous
Anonymous
@IvUyr @AlexFails будьте так добры посмотрите личку
Как проще всего реализовать вывод 8-байтового числа в консоль без использования libc (только средствами системных вызовов Linux)?
Aiwan \ (•◡•) / _bot
по символьно писать каждую цифру числа. не используешь библиотеки - пиши все сам
Хотя там не байт как раз, там надо хитрить. Буду разбираться
Aiwan \ (•◡•) / _bot
Просто арифмтикой по ASCII побайтово?
да, там где деление на 10 и запись остатка или его формирование в строку для вывода сразу всех цифр
зачем хитрить?
Да не, я про деление как раз говорил.
Aiwan \ (•◡•) / _bot
Да не, я про деление как раз говорил.
edx:eax делим на что то 4х байтовое. все прекрасно помещается
Anonymous
@AlexFails можно вашего внимание в ЛС?
Anonymous
@AlexFails
Anonymous
@IvUyr ЛС
Red
Добрый день. В DOS можно в int 21-9 давать указатель на строчку на стеке? Работает, но это легально? Написано DS:dx. Или это не значит, что указатель должен быть на сегмент данных? https://stanislavs.org/helppc/int_21-9.html
Eugene
Главное, чтобы строка лежала выше указателя стека, а не ниже (вблизи sp), иначе она может быть затёрта.
Red
Окей, спасибо. Меня просто смутило то, что на сайте зачем-то написали ds:dx, а не просто dx.
Eugene
Окей, спасибо. Меня просто смутило то, что на сайте зачем-то написали ds:dx, а не просто dx.
Не зачем-то, а потому что именно DS определяет сегмент, в котором хранится строка. Если у вас строка будет в SS, но DS не будет равен SS, вы такую строку не выведете.
Red
Не зачем-то, а потому что именно DS определяет сегмент, в котором хранится строка. Если у вас строка будет в SS, но DS не будет равен SS, вы такую строку не выведете.
Шикарно объяснили. Я наконец-то понял полностью. Спасибо! Кстати, почему бы не сделали так, чтобы можно было передавать абсолютный адрес регистром? Можно с уверенностью сказать, чем было обусловлено такое решение?
Eugene
Какой абсолютный адрес? Линейный? Адрес 20-битный, а регистры 16-битные. В 8086 и 80286, по крайней мере.
Eugene
Поэтому там была сегментная адресация. А в 80386 и пр. осталась по наследству.
Vladimir
Шикарно объяснили. Я наконец-то понял полностью. Спасибо! Кстати, почему бы не сделали так, чтобы можно было передавать абсолютный адрес регистром? Можно с уверенностью сказать, чем было обусловлено такое решение?
Это сумрачный гений Интела придумал сегментные регистры, чтобы можно было адресовать овердофига памяти с помощью 16-битного регистра. Потом он, видимо, курнул чего-то ещё более забористого и придумал дескрипторные таблицы и, мать их за ногу, теневые регистры.
Red
Если предположить, что str всегда указывает на строчку на стеке, то что я не так делаю? Понимаю, что вопросы супер новичковые. Другого чата нет? Или норм?
Red
Чтобы получить смещение str относительно начала стека. Так ведь нужно?
Eugene
🤦‍♂ Изучите сегментную адресацию для начала. Физический адрес = линейный адрес (в DOS) = сегмент*16 + смещение. А теперь подумайте, если адрес строки = ss:str, а вам надо адрес строки указать в ds:dx, что нужно сделать?
Eugene
Мне точно нужен ds == ss. А в dx положить смещение.
Бинго! :)) И никаких лишних телодвижений больше не надо :)
Eugene
Я вот только не знаю, в каком виде передаётся char* в функцию. Может, там пара сегмент:смещение и надо делать lds dx,str ?
Eugene
Потому что строка не обязана быть в стеке. Она может быть и в сегменте данных, и в динамический памяти. Да, кстати, думаю, ds просто так менять тоже нельзя, надо push-pop сделать.
Red
Бинго! :)) И никаких лишних телодвижений больше не надо :)
Но ведь чтобы посчитать смещение мне и нужно вычесть из полного адреса его сегмент?
Red
Я в обучающих целях принял за аксиому то, что строка лежит на стеке. И я её создаю в коде на стеке. Не думаю, что её оптимизации уберут.
Eugene
Но ведь чтобы посчитать смещение мне и нужно вычесть из полного адреса его сегмент?
Из какого полного адреса? У вас есть только сегмент и смещение. Если ds = ss, а str = dx, то ss:str и ds:dx будут указать на разные участки памяти или на одно? Ну логически если подумать.
Red
А вот фиг знает что из лежит в char*. Смещение?
Eugene
Но ведь чтобы посчитать смещение мне и нужно вычесть из полного адреса его сегмент?
Не вычесть, а прибавить (умноженное на 16), и только если у вас сегмент = 0 (но так не получится во многих случаях, т.к. линейный адрес не влезет в 16 бит). А если сегменты равны, почему смещения должны отличаться?
Eugene
А вот фиг знает что из лежит в char*. Смещение?
Отладчик знает. Я думаю, пара. В Паскале пара, в Си, думаю, тоже. Я во времена ДОСа на Си не писал, не знаю поэтому.
Eugene
Но ведь чтобы посчитать смещение мне и нужно вычесть из полного адреса его сегмент?
Вот у вас есть адрес: 0x100:0x300. Неважно, в каких парах регистров он лежит (ds:dx, es:bx, ss:bp или ещё где-то), он указывает на одну и ту же область. Ну логично же? Линейный адрес = 0x100*16 + 0x300 = 0x1000 + 0x300 = 0x1300. Хотите указывайте 0x100:0x300, хотите 0:0x1300, хотите 0x130:0 или 0x123:0xD0 - это будут указатели на одну и ту же область.
s54820
А вот фиг знает что из лежит в char*. Смещение?
В досе были __near и __far, в __far лежали сегмент с офсетом. А вот что из этого по умолчанию — зависело от модели памяти, которая была задана компилятору.
Red
Вот что дебаг даёт. ds показывает.
Eugene
Вот что дебаг даёт. ds показывает.
Надо смотреть, как указывается адрес перед вызовом функции.
Eugene
Смысл в саму строку глядеть?
Eugene
Ещё можно sizeof(char*) посмотреть - 2 байта или 4.
Eugene
Или в настройки компилятора, как уже подсказали выше.