Aiwan \ (•◡•) / _bot
есть еще с танцами
Saenro
superiority
Нужно закрыть предмет
superiority
Длится один модуль
Знаю языки программирования но не ассемблер
⸙ꠋꠋk̹̺ Seymøur
Отличная возможность его выучить как раз
usernameak
Anonymous
я могу както определить тип устройства на котором я нахожусь на винде?(лептоп, пк, планшет). Может ктото знает какойто рокетсайнс
Co(n)stantine👨🔬
Co(n)stantine👨🔬
superiority
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
superiority
Бежишь по массиву, суммируешь все числа одно за другим, потом сумму этих чисел делишь на количество этих чисел.
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
ඞ
ඞ
ඞ
Буфферы специально под неё раскладывает.
ඞ
Гнутый стэк-протектор точно так делает.
ඞ
Вот так буду делать, наверное https://stackoverflow.com/questions/53128561/anonymous-labels-in-att-assembly
Anonymous
Anonymous
@IvUyr @AlexFails будьте так добры посмотрите личку
ඞ
Как проще всего реализовать вывод 8-байтового числа в консоль без использования libc (только средствами системных вызовов Linux)?
Aiwan \ (•◡•) / _bot
по символьно писать каждую цифру числа. не используешь библиотеки - пиши все сам
ඞ
ඞ
Хотя там не байт как раз, там надо хитрить. Буду разбираться
ඞ
Aiwan \ (•◡•) / _bot
ඞ
Anonymous
@AlexFails можно вашего внимание в ЛС?
Anonymous
@AlexFails
Anonymous
@IvUyr ЛС
Red
Добрый день.
В DOS можно в int 21-9 давать указатель на строчку на стеке? Работает, но это легально? Написано DS:dx. Или это не значит, что указатель должен быть на сегмент данных?
https://stanislavs.org/helppc/int_21-9.html
s54820
Eugene
Главное, чтобы строка лежала выше указателя стека, а не ниже (вблизи sp), иначе она может быть затёрта.
Vladimir
Red
Окей, спасибо. Меня просто смутило то, что на сайте зачем-то написали ds:dx, а не просто dx.
Eugene
Какой абсолютный адрес? Линейный?
Адрес 20-битный, а регистры 16-битные.
В 8086 и 80286, по крайней мере.
Eugene
Поэтому там была сегментная адресация.
А в 80386 и пр. осталась по наследству.
Red
Red
Если предположить, что str всегда указывает на строчку на стеке, то что я не так делаю? Понимаю, что вопросы супер новичковые. Другого чата нет? Или норм?
Red
Eugene
Red
Чтобы получить смещение str относительно начала стека. Так ведь нужно?
Eugene
🤦♂
Изучите сегментную адресацию для начала.
Физический адрес = линейный адрес (в DOS) = сегмент*16 + смещение.
А теперь подумайте, если адрес строки = ss:str, а вам надо адрес строки указать в ds:dx, что нужно сделать?
Red
Eugene
Я вот только не знаю, в каком виде передаётся char* в функцию. Может, там пара сегмент:смещение и надо делать lds dx,str ?
Eugene
Потому что строка не обязана быть в стеке. Она может быть и в сегменте данных, и в динамический памяти.
Да, кстати, думаю, ds просто так менять тоже нельзя, надо push-pop сделать.
Red
Red
Я в обучающих целях принял за аксиому то, что строка лежит на стеке. И я её создаю в коде на стеке. Не думаю, что её оптимизации уберут.
Red
А вот фиг знает что из лежит в char*. Смещение?
Eugene
Но ведь чтобы посчитать смещение мне и нужно вычесть из полного адреса его сегмент?
Вот у вас есть адрес: 0x100:0x300.
Неважно, в каких парах регистров он лежит (ds:dx, es:bx, ss:bp или ещё где-то), он указывает на одну и ту же область. Ну логично же?
Линейный адрес = 0x100*16 + 0x300 = 0x1000 + 0x300 = 0x1300.
Хотите указывайте 0x100:0x300, хотите 0:0x1300, хотите 0x130:0 или 0x123:0xD0 - это будут указатели на одну и ту же область.
Red
Вот что дебаг даёт. ds показывает.
Eugene
Смысл в саму строку глядеть?
Eugene
Ещё можно sizeof(char*) посмотреть - 2 байта или 4.
Eugene
Или в настройки компилятора, как уже подсказали выше.