LINUX.ORG.RU

35
Всего сообщений: 80

Киньте в меня учебником по современному x86 асму

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

 , , ,

kookoo ()

Для HelloWorld Assembler лучший язык

http://www.opennet.ru/opennews/art.shtml?num=51992

Вот видео: https://2ton.com.au/videos/tvs_part1/tvs_part1.mp4

Кстати, заметил что даже для hello world он плохо тестил, не добавил флаги оптимизации:

https://imgur.com/a/zKaqZxG

Вот сравните: https://gcc.godbolt.org/z/DZQn4q

https://gcc.godbolt.org/z/fKpEkv

 

fsb4000 ()

Не удается скомпилировать код а asm вставкой

В теме Как включить графику или хотя бы текстовый цветной режим? установил QEMU ARM64. Там Debian 10, и есть gcc 8.3

Есть пример: http://www.ethernut.de/en/documents/arm-inline-asm.html

Есть простая программа:

#include <stdio.h>
int main()
{
printf("test\n");
asm("mov r0, r0");
}
При компиляции gcc test.c -o test пишет: operand 1 must be an integer register. Жалуется на строку mov r0, r0. Она же из примера взята, что ему не нравится? Пробовал r20, r30, всегда один ответ.

 , , ,

I-Love-Microsoft ()

А кто сейчас пишет программы?

На первом месте китайцы, потом индусы, потом америкосы, потом евросоюз, африка...
А наши на каком месте?

 , , , ,

quantum_cat ()

Помогите исправить подсветку синтаксиса smali для Far Manager

Высрал https://pastebin.com/pBH5hzqE, а оно не работает. Документации по фару как-то мало, непонятно что делать.

Да, знаю, на винфак, но колорер может работать и в миднайте! Да и где еще искать виндоадминов, если не тут?

 , ,

sogiyo ()

fasm обновился до версии 1.73.10

Сабж. В новой версии были добавлены инструкции «cldemote», «tpause», «umonitor» и «umwait».
Скачать: https://flatassembler.net/fasm-1.73.10.tgz .

Напомню что это такое:

fasm (сокращение от flat assembler) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Tomasz Grysztar). fasm самодостаточен[1], изначально компилировался TASM’ом и стал способен собираться из собственных исходных кодов начиная с версии 0.90 (4 мая 1999). fasm обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач.[2][3] Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без компоновщика. В остальных случаях нужно использовать сторонние компоновщики, поскольку таковой вместе с fasm не распространяется.

Помимо базового набора инструкций процессора и сопроцессора fasm поддерживает наборы инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a, AVX и 3DNow!, а также EM64T и AMD64 (включая AMD SVM и Intel SMX).

Компиляция программы в fasm состоит из 2 стадий: препроцессирование и ассемблирование.

https://ru.wikipedia.org/wiki/Fasm

 , ,

saahriktu ()

asm retf segfault

Привет лор, снова.

В ходе работы над задачей из этого ASM CS:RIP store'n'load треда, образовался следубщий код: https://gist.github.com/JAkutenshi/1486d1eb5e48d1117a03e0db68ad8f7b

Вкратце: сохраняются cs и ip во внешние переменные в первом инлайне, во втором заносятся в стек и вызывается retf. Проверил в gdb: косяков с пересекающимися регистрами нету, все в стеке лежит аккуратно и верно, скриншот прилагается: https://imgur.com/a/y80SATM

retf последовательно забирает со стека первые 8 байт, заносит в rip, вторые в cs, что соответствует переходу на сл. после lea, вторую сверху, строчку. Что должно дать неожиданный 0 в переменной i и завершением программы с кодом 1. Но вместо этого он мне гордо показывает segfault на выполнении retf. ЧЯДНТ?

 

JAkutenshi ()

ASM CS:RIP store'n'load

Привет, лор.

Предыстория: нужно сделать некоторый функционал, который позволит повторять код без использования циклов (на самом деле задача сложнее, но углубляться пока нету смысла). В чем бы сложность, спросит читатель, goto, jmp в помощь. А вот суть такова, что неизвестно сколько программист-пользователь захочет расставить таких «меток». Более того, его удобство требует, чтобы это были некоторые макросы. Пример:

void foo()
{
   MACRO_INIT()
   int i = 0;
   MACRO()
   i++
   MACRO()
   i--
   MACRO_FIN()
}

Собственно, между макросами что-то несколько раз повторяется. И макросов этих может быть сколько угодно. Собственно, метки как-то не вариант. Есть два возможных варианта решения, которые были придуманы: писать препроцессор, который будет генерировать и ставить метки в код; прыгать через связку cs:rip, сохраняя и загружая состояния в макросах. Оба варианта геморные и грязные, но второй удобнее для пользователя.

Вопрос: есть ли какое-то лучшее решение, чем такие грязные хаки?

Бонусом отмечу, что задача, в теории, еще сложнее: эти макросы могут быть расположены вне вызова foo() и считаться должны по цепочке, т.е. должен еще очищаться стек от того, что туда положилось от вызова функции. Да и переходы в другие операторные блоки тоже. Но хочется решать задачу постепенно.

 , ,

JAkutenshi ()

Полезность применения Python в компиляторах

Да, именно так. Нужно выяснить это, а то ошибки возникают при попытке воспользоваться Python-скриптами для автоматизации FASM для написания компиляторов

 , , ,

Marketersandmobile ()

Вышел nasm 2.14

Сабж. Changelog: https://fossies.org/linux/nasm/doc/changes.src

Помимо багфиксов добавили новые инструкции и опции.

Скачать: https://www.nasm.us/pub/nasm/releasebuilds/2.14/nasm-2.14.tar.xz

 , ,

saahriktu ()

IDE для ASM

Добрый день, коллеги, какое IDE вы используете для программирования на ассемблере?

 ,

rust_afari ()

segmentation fault

Привет, x32, вот такой выхлоп от gcc -S

.LLSDACSE1:
	.byte 0x1
	.byte 0
	.align 4
        .long DW.ref._ZTI14Fake_Exception-.

DW.ref._ZTI14Fake_Exception:
	.long _ZTI14Fake_Exception
	.hidden DW.ref._ZTI9Exception
	.weak DW.ref._ZTI9Exception
        .section .data.DW.ref._ZTI9Exception,"awG",@progbits,DW.ref._ZTI9Exception,comdat

_ZTI14Fake_Exception:
	.long _ZTVN10__cxxabiv117__class_type_infoE+8
	.long _ZTS14Fake_Exception
	.weak _ZTS14Fake_Exception
        .section .rodata._ZTS14Fake_Exception,"aG",@progbits,_ZTS14Fake_Exception,comdat
пытаюсь под gdb прочитать адрес _ZTI14Fake_Exception::_ZTVN10__cxxabiv117__class_type_infoE+8
(gdb) x/1aw 0x401743      # .LLSDACSE1+4
0x401743:       0x190000
(gdb) x/1aw 0x190000
0x190000:       Cannot access memory at address 0x190000
модуль загружен в память по адресу 0x400000. Что я не так делаю?
При этом, адрекс _ZTVN10__cxxabiv117__class_type_infoE+8 == 0x402ed8 (посмотрел по символам модуля+адрес загрузки+8).

 ,

pavlick ()

Ассемблерные ошибки при сборке GCCшкой

Привет. У меня есть небольшой just-for-fun проект. Под линуксом все собирается и работает ок, а под виндой при компиляции(или линковке?) виндовой gcc выпадает ошибка

C:\Users\user\AppData\Local\Temp\ccF9IWCB.s: Assembler messages:
C:\Users\user\AppData\Local\Temp\ccF9IWCB.s:343: Error: junk `(%rip)' after expression
C:\Users\user\AppData\Local\Temp\ccF9IWCB.s:343: Error: operand type mismatch for `lea'
В параметрах компиляции ничего необычного
-Wall -g -O0
Фишка в том, что у меня в исходниках нет ни одной ассемблерной вставки, я даж не знаю на какую часть кода жаловаться. Любезные GCC сеньоры, подскажите мне, куда копать.

 , ,

Aswed ()

Не работает ассемблерная вставка

Пишу на go однин модуль, задачу которую будет решать модуль - ресурсоёмка, предположительно на решение задачи будет уходить несколько часов, а то и дней, поэтому крайне важно сделать модуль максимально производительным. Сама задача неплохо векторизируется и распаралеливается, для векторизации использую функции на си с ассемблерными вставками. Ни разу не использовал связку c+asm, нагуглил как пользоваться и написал функцию на си, но ассемблерная вставка в функции не работает, вначале думал, что в вставке ошибка, решил посмотреть как вставка изменяют переменную с которой работает и просто вывел её через printf, после этого всё начало работать как положено, убираю printf и всё опять перестаёт работать. С printf работает даже если он не выводит никакой переменной. Прошу помощи с решением этой задачи, вот код:

#include <stdint.h>
__attribute__((always_inline)) inline uint32_t foo(int size, void *data1, void *data2){
	uint32_t tmpSum[4] __attribute__ ((aligned (16))) = {0, 0, 0, 0};
	uint32_t sum = 0;
	uint64_t offset = 0;
 	for (; size - offset >= 16; offset += 16){
		asm (	"movups (%0), %%xmm1\n"
			"pmulhuw (%1), %%xmm1\n"
			"movdqa %%xmm1, %%xmm2\n"
			"pxor %%xmm3, %%xmm3\n"
			"punpcklwd %%xmm3, %%xmm1\n"
			"punpckhwd %%xmm3, %%xmm2\n"
			"paddd %%xmm2, %%xmm1\n"
			"paddd (%2), %%xmm1\n"
			"movdqa %%xmm1, (%2)" : : "r" (data1 + offset), "r" (data2 + offset), "r" (tmpSum)
 		);
		//printf вставлял сюда
 	};
	for (;offset != size; offset += 2){
		sum += (uint32_t)(*(uint16_t *)(data1+offset)) * (uint32_t)(*(uint16_t *)(data2+offset));
 	};
	sum = sum >> 16;
	sum += tmpSum[0] + tmpSum[1] + tmpSum[2] + tmpSum[3];
	return sum;
}

 , , ,

Taetricus ()

Как найти точку входа в программе, если она не _start и не main?

Я нашёл программу, и незнаю прикол может какой нибудь. Но всё же, хотел бы изучить, но вот проблема, в gdb отладчике он не находит точку входи ни _start, ни main. Как быть?

 , ,

u0atgKIRznY5 ()

Различие в отношении rdtsc и clock_gettime() для разных функций

Проводил я тут сравнение скорости двух функций, которые делают по смыслу одно и то же, но записаны по-разному (одна через таблицу поиска, другая же через кучу if-ов), и там я замерял одновременно время двумя способами, впрочем смотрите сами http://pastebin.ca/3797458

Так вот, отношение величин gettime()/rdtsc() для функции f1 и функции f2 различаются, т.е. если построить по этим значениям график, то получим две полоски. Чем можно объяснить данный эффект?

Запускал я естественно через taskset 0x00000001 и sudo cpufreq-set -c 0 -f 2000MHz, проц Intel Core 2 Quad Q9300 в 64-bit режиме

http://pastebin.ca/3797465 - вывод программы

 , , , ,

SZT ()

Стек технологий для реверсинга

Для начала, посоветуйте современные свободные/открытые аналоги IDA и PVS-Studio. Которые еще и могут работать не только под винду, но и под линукс. И под 64 бита. Неплохо бы из асма какой-то си-подобный псевдокод или прям си. А для поисковщика ошибок ориентацию на C++.

Гугл у нас общий, но там куча каких-то полудохлых проектов, IDEшек на тикле от одного вида которых задница перекусывает чугунный лом, какие-то шеллскрипты для аппликух от которых уже и исходников не осталось... Вообще получасовое гугление протащило как будто по задворкам начала 2000х, хаос ужос и запустение. Я из Java и Javascript мира с няшными глянцевыми IDEшками, и все эти остатки ушедших в небытие цивилизаций создают тягостное ощущение..

Хотелось бы понять, на чем сейчас сидят реверсеры нативного кода (особенно реверсеры под линукс), какой стек технологий

 , , ,

stevejobs ()

Размер указателя и stack pointer

Есть код

#include <cstdlib>
#include <iostream>

using namespace std ;

int main() {
  register int sp asm ("rsp");
  printf("0x%016llx\n", sp);
  int intVal = 7 ;
  int&& intRval = 5 ;
  int& intLval = intRval ;
   
  cout << hex << (void*)&intVal << endl;
  cout << hex << &intRval << endl;
  cout << hex << &intLval << endl;
  
  return 0 ;
}

Компилирую так:

g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out

Выхлоп рограммы такой
0x0000000068bb5580

0x7ffe68bb5588

0x7ffe68bb558c

0x7ffe68bb558c

Хочу спросить, почему RSP(стек пойнтер) указывает на разные места???
И сколько фактически размер указателя на x86_64?
Тестировал тут http://coliru.stacked-crooked.com/

 , , ,

pulya ()

Атомарная ассемблерная вставка в gcc

Хочу реализовать самый примитивный мьютекс.

Написал такой код: http://pastebin.com/bqX9xKtQ
Компилять так: `gcc -pthread ./lock.c -o lock.elf -lpthread && ./lock.elf`

Прочитал статью в википедии: Тыц

XCHG — Операция обмена между памятью и регистром. Выполняется атомарно на x86-процессорах
Ассемблерная вставка соответствующей атомарной инструкции.

Я так понимаю что мой mutex_lock не является атомарным, а вместо него надо бы заюзать что-то вроде

__asm
{
    mov eax, 1
    xchg eax, mx
}

Так вот, как В ЭТОМ ВАШЕМ GCC С ЕГО ИНОПЛАНЕТНЫМ СИНТАКСИСОМ НАПИСАТЬ ТО ЖЕ САМОЕ?

Для тех кто не в курсе синтаксиса gcc:

asm volatile ( "rdtsc\n\t"   
               "shl $32, %%rdx\n\t"  
               "or %%rdx, %0"        
               : "=a" (msr)
               :
               : "rdx");

 , , ,

PPP328 ()

Вычислительная техника

Составить программу вычисления выражения: C=M(345h)-M(453h)+5Bh-A+L

Это чё от меня хотят то?

 , ,

eR ()