Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: cp58
Дата сообщения: 04.03.2012 19:22
Benchmark

Цитата:
Ну почему же:
PUSHAQ / POPAQ - Push/pop all 64-bit general registers (except for RSP)

Впервые слышу, откуда информация?
Посчитайте сколько вставит в стек эта инструкция(960 байт).
delover

Цитата:
Этот старый код шифрует данные реальные новые данные и юзается на полную, реальные датасеты, как раз там где FB загибается. Писать сиё на языках высокого уровня просто идиотизм мне кажется.

Ну все, уморили вы меня.
Какая задача? Напишите код на ассемблере, я на Си.
Современные компиляторы высокого уровня генерируют очень быстрый код, который может улучшить только программист, хорошо понимающий архитектуру процессора. Вы слышали про конвейер, SIMD?
Автор: Benchmark
Дата сообщения: 04.03.2012 19:41
cp58

Цитата:
Впервые слышу, откуда информация?

Из мануалов Intel.


Цитата:
Посчитайте сколько вставит в стек эта инструкция(960 байт)

Количество регистров на 64-бит процессорах увеличилось, разрядность - тоже.

P.S. Звиняюсь, перечитал тред, нужна стандартная команда-аналог PUSHAD/POPAD. Стандартной нет. Но это никак не мешает написать простейший макрос, выполняющий данную функцию. У самого именно так.
Автор: akaGM
Дата сообщения: 04.03.2012 20:13

Цитата:
PUSHFQ Valid in 64-bit mode Push RFLAGS.

In 64-bit mode, the instruction’s default operation is to decrement the stack pointer
(RSP) by 8 and pushs RFLAGS on the stack. 16-bit operation is supported using the
operand size override prefix 66H. 32-bit operand size cannot be encoded in this
mode. When copying RFLAGS to the stack, the VM and RF flags (bits 16 and 17) are
not copied; instead, values for these flags are cleared in the RFLAGS image stored on
the stack.


opcode


ELSE IF 64-bit MODE (* In 64-bit Mode *)
IF OperandSize = 64
THEN
push (RFLAGS AND 00000000_00FCFFFFH);
(* VM and RF RFLAG bits are cleared in image stored on the stack; *)
ELSE
push (EFLAGS); (* Lower 16 bits only *)
FI;
...

Автор: cp58
Дата сообщения: 04.03.2012 22:07
Benchmark

Цитата:
Из мануалов Intel.

Про x64 инструкции корректнее ссылаться на amd, но не суть, ведь такой инструкции нет.

Цитата:
Количество регистров на 64-бит процессорах увеличилось, разрядность - тоже.

К чему это вобще? Я вел к нецелесообразности такой инструкции, поскольку гоняется ~128 байт.
P.S. Выше я оговорился про 960 байт, конечно я имел ввиду бит.
Автор: delover
Дата сообщения: 05.03.2012 07:09
cp58

Цитата:
Какая задача? Напишите код на ассемблере, я на Си.
Современные компиляторы высокого уровня генерируют очень быстрый код, который может улучшить только программист, хорошо понимающий архитектуру процессора. Вы слышали про конвейер, SIMD?

Полный код в предыдущем посте был и не изменился. Вы слышали про такие инструкции как

Код:
MOV EDI, P <-Вот сдесь
MOV ESI, EDI
MOV ECX, Count <-Вот сдесь
PUSH EDI
PUSH ECX
XOR EAX, EAX
@@1: LODSB <-Вот сдесь
Автор: delover
Дата сообщения: 05.03.2012 16:30
В XE2 ещё немного бажный ассемблер, неправильно параметру в процедуру передаются, похоже решение purepascal было обосновано. Придётся согласиться с ЦП и писать пурь аналог.

Добавлено:
Да не всё так просто оптимизатор ассемблера в XE2 не завершон - это радует. Пока борюсь с тем что есть.

Добавлено:
Напишу яснее синтаксис директив register - pascal и особенно stdcall ещё не изучен. Думаю скора буде гатова
Автор: cp58
Дата сообщения: 05.03.2012 22:15
delover

Цитата:
Полный код в предыдущем посте был и не изменился.

Я хотел узнать что делает подпрограмма изначально, без реализации на языках программирования. По коду я вижу, что подпрограмма зачем-то мучает память по адресу P.

Цитата:
В XE2 ещё немного бажный ассемблер, неправильно параметру в процедуру передаются

Как корабль назовешь...
Все строго по соглашению вызова(pascal,cdecl,stdcall,fastcall).
Автор: delover
Дата сообщения: 06.03.2012 04:55
cp58

Цитата:
Все строго по соглашению вызова(pascal,cdecl,stdcall,fastcall).

У меня XE2 update1. Никаких параметров в ассемблерную процедуру не передаётся - в регистрах под отладчиком CPU строго нули. И это при любой директиве вызова.


Цитата:
Я хотел узнать что делает подпрограмма изначально

Ассемблерная часть - это составляющая клиентской базы данных. Она просто шифрует TMemoryStream для того чтобы под HEX редактором нельзя было редактировать данные в таблицах. Никакого супер функционала она не несёт. Та часть которую я выложил расшифровывает данные. Соответственно Turnoff зашифровывает. Полный код датасетов на сорцефорже по линку.


Цитата:
Все строго по соглашению вызова

Попробую сделать так begin asm end; end; может удастся обмануть.
Автор: delover
Дата сообщения: 06.03.2012 16:58
Попыталса бомбануть -
[DCC Error] Unit1.pas(37): E1025 Unsupported language feature: 'ASM'
Автор: cp58
Дата сообщения: 06.03.2012 20:01
delover

Цитата:
Ассемблерная часть - это составляющая клиентской базы данных. Она просто шифрует TMemoryStream для того чтобы под HEX редактором нельзя было редактировать данные в таблицах. Никакого супер функционала она не несёт. Та часть которую я выложил расшифровывает данные. Соответственно Turnoff зашифровывает. Полный код датасетов на сорцефорже по линку.

В чем сложность человеку произвести расшифровку, тем более с открытым алгоритмом, если алгоритмы в закрытом ПО вскрываются быстро.
Но если вы свято верите в это, то вот этот код не позволит нормально просматривать в hex-редакторе:

Код: for (int i=0;i<count;p[i]^=0xaa,i++){}
Автор: delover
Дата сообщения: 09.03.2012 16:36
cp58
Сори небыло времени на вопрос ремонтировал комп.

Цитата:
Банальное сложение по модулю.

Вполне устраивает, только я чувак покруче вот и всё.

Цитата:
А в стеке?

Блин там тоже нули.
Автор: delover
Дата сообщения: 12.03.2012 08:43

Цитата:
Банальное сложение по модулю.

Да и такое сложение вычисляется сразу как только встречаются повторяющиеся данные типа простенького BMP или сортированного списка.
Автор: cp58
Дата сообщения: 12.03.2012 10:51
delover

Цитата:
Да и такое сложение вычисляется сразу как только встречаются повторяющиеся данные типа простенького BMP или сортированного списка.

Я еще раз говорю, что ни первое, ни второе вас не спасет, а привел наименее затратную операцию для ваших убеждений.

Цитата:
Но если вы свято верите в это
Автор: delover
Дата сообщения: 13.03.2012 08:33
cp58
Почему спасёт я сейчас переписываю на 64 асм. Оказывается я очень тупо ошибался, окно CPU расчитано на 32 бит регистры, когда я раздвинул панель регистров то с удивлением обнаружил что там не нулики.

Цитата:
наименее затратную операцию

Наименее затратная действительно не спасёт, потому что мне нужно иметь доступ к реальным данным в описанном формате. На данный момент уже первые 6 байтов правильно шифрую, дальше видимо со сдвигами что то не так. Мои затраты это после работы вечером на минут 10 заглядываю в XE2 а потом запускаю онлайн игру.

Добавлено:

Цитата:
Да и такое сложение вычисляется сразу

Это 100% проверенное утверждение, ломал программку в которой ресурсы таким способом были шифрануты, как раз xor AA55. Сначала BMP-шки нашол, так как знаю первые 2 байта которые нужно получить, а потом и dfm выдернул. Однако когда просил помочь мне сломать мою программку все отказались - "использованы грязные технологии" сказали, я так и не понял что это означает. Вобщето деньги предлагал в варезе.
Автор: cp58
Дата сообщения: 13.03.2012 11:10
delover

Цитата:
Это 100% проверенное утверждение, ломал программку в которой ресурсы таким способом были шифрануты, как раз xor AA55. Сначала BMP-шки нашол, так как знаю первые 2 байта которые нужно получить, а потом и dfm выдернул. Однако когда просил помочь мне сломать мою программку все отказались - "использованы грязные технологии" сказали, я так и не понял что это означает. Вобщето деньги предлагал в варезе.

Закрытые алгоритмы надежны лишь до поры до времени. На предыдущей странице размещена ссылка на проект, а значит и алгоритм открыт, надежность спустилась до нуля.
Автор: delover
Дата сообщения: 13.03.2012 18:40
cp58
Да это бред Вы полный дед садовец в понятии защита данных, если так думаете. Все знают пароль masterkey но никто же не говорит что из за этого обстоятельства база FB менее защищённой стала. Никто не запрещает поменять пару цифирей в публичном алгоритме или даже привязать собственный для тех проектов которые помешаны на защите.
Автор: A1exSun
Дата сообщения: 14.03.2012 23:21
Ребят, как отсортировать строку символов в кодировке oem866 по алфавиту?
Там и большие и маленькие буквы. Распишите детально пожалуйста алгоритм.
Автор: bomzzz
Дата сообщения: 14.03.2012 23:26
взять нулевую строку линейную, каждый элемент сопоставить букве алфавита (a b c d e ...), причем асци коды идут по порядку с дыркой посередке, что позволяет использовать номер ячейки буквы ее асци код. потом прочитать заданный текст, прибавлять к каждой ячейке 1. потом вывести массив пропуская нули

Добавлено:
если тебе такую задачу где то в учебном заведении поставили то они хотя т от тебя чтоб ты реализовал стандартный алгоритм быстрой сортировки. а эта задача некорректная для этого. я когда в школе так задачу эту решил меня заставили переделывать

Добавлено:
так в гугле и набери алгоритмы быстрой сортировки

Добавлено:
чтоб задача была корректная надо сортировать массивы не из одного элемента, а строки. а вот тут быстро алгоритм сортировки такой метод обгонит по скорости. наверно на трех элементах уже быстрее будет
Автор: cp58
Дата сообщения: 15.03.2012 12:56
A1exSun
s1,s2 - буквы.
Если код символа >= a, то offset=0x20, иначе 0.
Если s1-offset < s2-offset, то буква s1 находится ближе к началу алфавита.
В случае равенства: если s1 < s2, то буква s1 заглавная, в противном случае наоборот.
Это условие сравнения, а алгоритм сортировки можно использовать любой.
Автор: bomzzz
Дата сообщения: 16.03.2012 21:21
новая версия эмулятора вышла и в инете русский хелп на него сделали. хотя вроде пишет версия такая же, файл стал меньше.

http://ziplib.com/emu8086/
http://www.twirpx.com/file/2972/

http://zalil.ru/32891883
Автор: delover
Дата сообщения: 18.03.2012 12:42
cp58
Не обращайте на мои слова внимания (про детсад). В основном мои программы требуются клиентам которые и не собираются взломать данную программу, а надеются только на сопровождение продукта в дальнейшем. Ассемблер на 64 версию переписал, но только выяснилось что Delphi XE2 в ассемблере не умеет компилить LOOP правильно, а вместо него вставляет LOOPNE. Когда заменил на DEC RCX JNZ то всё стало работать так же как и раньше.
Автор: A1exSun
Дата сообщения: 18.03.2012 18:44
di+dp работает только со стеком?

Код: lea di, digits
...
mov bp, ax
inc [di][bp]
Автор: akaGM
Дата сообщения: 18.03.2012 19:12
A1exSun
а что такое "dp"?

по умолчанию [di] относительно es, [si] относительно ds
[bx] и [bp] оносительно стека
[di+bp] -- не определено...
Автор: Abs62
Дата сообщения: 18.03.2012 19:41
akaGM
Не так. По умолчанию все команды, кроме строковых, индексируются по DS, если среди индексных регистров нет регистра BP, и по SS, если он есть.
В строковых (STOS, MOVS, SCAS и CMPS) - DI по ES, SI по DS.
Автор: A1exSun
Дата сообщения: 18.03.2012 19:48
akaGM
Мне нужно посчитать количество цифр в массиве text, количество каждой цифры в digits+цифра.
Весь код:

Код: assume cs: code, ds: data, ss: stck
mov ax, data
mov ds, ax
mov es, ax
; вывод приглашения
lea dx, welcome
call print
; чтение строки
mov ah, 0ah
lea dx, text
int 21h

; цикл
lea si, text+1
lea di, digits
mov cl, [si]
inc si
xor ax, ax
xor bx, bx
for:
mov al, [si][bx]
; проверка цифры
cmp al, 30h
jl notdigit
cmp al, 39h
jg notdigit
; al - цифра
mov bp, ax
sub bp, 30h
; увеличение счетчика в массиве
inc byte ptr es:[di][bp]
jmp next
notdigit:
; проверка буквы
; ...
next:
inc bl
cmp bl, cl
jne for
Автор: akaGM
Дата сообщения: 18.03.2012 20:10
A1exSun
а что не так-то?
например, можно не бояться вводить новые переменные...

Abs62
ну наверное...
Автор: Abs62
Дата сообщения: 18.03.2012 20:28
A1exSun

Цитата:
количество каждой цифры в digits+цифра

Можешь использовать регистр и константу. Что-нибудь вроде "inc byte ptr [di+offset digits]".
Автор: A1exSun
Дата сообщения: 18.03.2012 21:18
[more=Длинный код]
Код: data segment
welcome db "Введіть рядок символів з цифр і літер:", 13, 10, '$'
text db 81, 0, 80 dup(0), '$'
digits db 10 dup(0)
letters db 0
error db 13, 10, "Помилка! Рядок містить недопустимі символи.", '$'
data ends

stck segment stack
dw 128 dup(0)
stck ends

code segment
start:
; встановлення сегментних регістрів
assume cs: code, ds: data, ss: stck
mov ax, data
mov ds, ax
mov es, ax
; виведення запрошення
lea dx, welcome
call print
; введення рядка
mov ah, 0ah
lea dx, text
int 21h
; цикл перевірки символів та підрахунку
lea si, text+1
lea di, digits
mov cl, [si]
inc si
xor ax, ax
xor bx, bx
for:
mov al, [si][bx]
; перевірка цифри
cmp al, 30h
jl notdigit
cmp al, 39h
jg notdigit
; al - цифра
mov bp, ax
; збільшення лічильника цифри
inc es:[di][bp-30h]
jmp next
notdigit:
; перевірка букви
cmp al, 'A'
jl notlatupp
cmp al, 'Z'
jg notlatupp
jmp isletter
notlatupp:
cmp al, 'a'
jl notlatlow
cmp al, 'z'
jg notlatlow
jmp isletter
notlatlow:
cmp al, 'А'
jl notcyrfir
cmp al, 'п'
jg notcyrfir
jmp isletter
notcyrfir:
cmp al, 'р'
jl notcyrsec
cmp al, 'я'
jg notcyrsec
jmp isletter
notcyrsec:
; виведення повідомлення про помилку
lea dx, error
call print
jmp exit
; збільшення лічильника букв
isletter:
inc letters
next:
inc bl
cmp bl, cl
jne for
; сортування
mov dl, [text+1]
lea bx, text+2
call sort
; виведення відсортованого рядка
lea dx, text+2
call print


exit:
; очікування натиснення будь-якої клавіші
mov ah, 0h
int 16h
; повернення в операційну систему
mov ah, 4ch
int 21h
; процедура виведення тексту на екран
print proc
mov ah, 9
int 21h
ret
print endp
; процедура сортування
sort proc
do_loop_top:
mov si, 0 ; i
mov di, 0 ; i+1
inc di
mov dh, 0 ; exchanges
dec dl ; n
for_loop:
mov ch, 0
mov cl, dl
for_loop_top:
jcxz for_loop_done
mov al, [bx+si]
cmp al, [bx+di]
jle nexti
mov ah, [bx+di]
mov [bx+di], al
mov [bx+si], ah
inc dh ; exchanges++
nexti:
inc si
inc di
dec cx
jmp for_loop_top
for_loop_done:
cmp dh, 0
jg do_loop_top
ret
sort endp

code ends
end start
Автор: SERGE_BLIZNUK
Дата сообщения: 19.03.2012 12:48
A1exSun
для вывода текста функцией 9 нужно, чтобы в конце строки стоял знак '$'
этого можно добиться, например, так:

Код:
; виведення відсортованого рядка
lea di, text+1

mov bh, 0
mov bl, [di]
mov byte ptr [di+bx+1], '$'

lea dx, text+2
call print
Автор: A1exSun
Дата сообщения: 19.03.2012 14:13
SERGE_BLIZNUK
Так это ведь:

Код: text db 81, 0, 80 dup(0), '$'

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.