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

» Assembler

Автор: akaGM
Дата сообщения: 16.05.2012 15:31
тока хотел встрять...
что оптимизировать демо-примеры...

как-то давным-давно мы вмногером поспорили кто и на каком языке напишет самую маленькую прогу beep, кот. заставит пукнуть писи-хрипер

посоревнуемся?
Автор: Yvaliko
Дата сообщения: 16.05.2012 15:50

Цитата:
а не подумалось, что крлф потом еще пять раз отдельно пишется, для перевода строки?
Но ведь не написалось же
И потом, можно 13, 10 просто в конец каждой строчки добавить. В байтах это меньше чем код макроса.

Цитата:
посоревнуемся?
У меня где то был код пищалки, как раз из старых экспериментов с бутами. Не уверен только что он в той части данных, которые я спас со старого харда.
Автор: bomzzz
Дата сообщения: 16.05.2012 15:53
да хоть сто раз пишеться, ты место что ли экономишь на флоппи дискете
Автор: MERCURY127
Дата сообщения: 16.05.2012 15:53
akaGM, "я угадаю эту мелодию с семи нот"... beep.com:
B8 07 0E CD 10 CD 20
Автор: Yvaliko
Дата сообщения: 16.05.2012 16:06

Цитата:
ты место что ли экономишь на флоппи дискете
Да. Дети выросшие на 30 мегабайтном харде выростают жаднымит.

Цитата:
B8 07 0E CD 10 CD 20
Мда. Мой намного длиннее.
Автор: akaGM
Дата сообщения: 16.05.2012 16:06
MERCURY127
у меня ровно в семь раз меньше, с тем же 7-ым кодом:
beep.bat
^7
один байт...

язык -- досовский шелл, а других ограничительных условий не было...
это к вопросу о некорректно поставленной задачe, помнишь анек о гене и чербургене с их бюро добрых услуг?
Автор: priorovod
Дата сообщения: 16.05.2012 17:09
Вопрос по asm используемом в delphi 2009. Необходимо реализовать вставку кода на асме в дельфи. Для этого в delphi вызываю функцию написанную на асм, в которую надо передать два числа:


Код:
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,i: integer;
dat: string;
begin
y:=0;
dat:=Edit1.Text; //"12345"
for i := 1 to length(dat) do
begin
x:=ord(dat[i]);
y:=iter1(x,y); //та самая функция
end;
showmessage(inttostr(x+y));
end;

function iter1(x,y: integer): integer;
label
lb1,lb2,lb3;
asm
shl eax, 8
xor edx, eax
lb1:
test dh,$80
je lb2
add edx, edx
xor edx, $8021
jmp lb3
lb2: add edx,edx
lb3: dec eax
jnz lb1
and edx,$0FFFF
mov eax, edx
end;
Автор: akaGM
Дата сообщения: 16.05.2012 17:26
priorovod
у функи заголовок херовый...

Код: function iter1(x,y: integer): integer; assembler;
asm
shl eax, 8
xor edx, eax
@@lb1:
test dh,$80
je @@lb2
add edx, edx
xor edx, $8021
jmp @@lb3
@@lb2: add edx,edx
@@lb3: dec eax
jnz @@lb1
and edx,$0FFFF
mov eax, edx
end;
Автор: Abs62
Дата сообщения: 16.05.2012 17:53
MERCURY127

Цитата:
а не подумалось, что крлф потом еще пять раз отдельно пишется, для перевода строки? Оптимизация, ага ...

Ну не дописал человек пару символов, но идея-то верная?

Код: welcome db "Welcome to Assembler!"
CRLF db 13, 10, '$'
Автор: MERCURY127
Дата сообщения: 16.05.2012 17:57
akaGM, в принципе, я что то похожее и ожидал если не считать "beep.bat [1] Invaliid command" и необходимости шелла кб от 10 до 300, как 4DOS, и принять сообщение об ошибке за нужный результат - то принято
Кстати, тетрацией я называл вот это http://ru.wikipedia.org/wiki/Тетрация - для нее в фортране есть особый оператор, как для степени?

Добавлено:

Цитата:

welcome db "Welcome to Assembler!"
CRLF db 13, 10, '$'

а каково это другому человеку распарсить? не, я не спорю - съэкономлен 1 (!!!) байт...
Автор: akaGM
Дата сообщения: 16.05.2012 18:12
MERCURY127

Цитата:
принять сообщение об ошибке за нужный результат - то принято

ну да, ну да... поэтому я про анекдот и вспомнил...
нужный результат -- бип
и согласись, что bat как и ехе/сом пойдёт на любой винде, и для этого ничего с собой носить не надо...


а тетрации нет, да...
зато появились матричные операторы, хотя я в них уже не спец, тут лучше в нашем топе спрашивать...


вот и мои 5 копеек:

я за

welcome db "Welcome to Assembler!", '$'
CRLF db 13, 10, '$'

как паскалист говорю, есть write() / writeln(), я за автоном...
Автор: Yvaliko
Дата сообщения: 16.05.2012 18:30

Цитата:
съэкономлен 1 (!!!) байт...

Нет, сэкономлено намного больше.
Функция выводит строку пока не наткнется на символ '$'.
Значит она выведет "Welcome to Assembler!" 13, 10, '$'
Следовательно вметсо

Код: dos_print welcome
dos_print CRLF
Автор: Abs62
Дата сообщения: 16.05.2012 18:33
MERCURY127

Цитата:
а каково это другому человеку распарсить?

Самому какое-то время спустя тоже может быть непросто.

Цитата:
не, я не спорю - съэкономлен 1 (!!!) байт...

Один байт в сегменте данных. И одно включение dos_print в сегменте кода, а это чуток поболе байтов будет.

А если серьёзно, я и сам давно уже сделал выбор в пользу читаемости кода против вычурности всяких трюков.
Автор: MERCURY127
Дата сообщения: 16.05.2012 18:48

Цитата:
Самому какое-то время спустя тоже может быть непросто

во во я сам то теперь не понимаю собст код пяти-семилетней давности... сижу и думаю - ба, неужто это я писал? старею, видимо - 30 лет стукнуло...
Автор: delover
Дата сообщения: 16.05.2012 21:51
Вы посмотрите на код Восемнадцатилетней давности. Про себя - ярый противник ассемблера - на ассемблере не должны писать люди. Бывают инопланетяне - им можно, но даже им вредно. Однако при нынешнем брожении в мозгах ИТ специалистов, когда нельзя оптимизировать 2 условия логических примерно для 80 миллионов пользователей, тогда прогноз - ассемблер жить пока будет.
Автор: priorovod
Дата сообщения: 16.05.2012 22:35
akaGM
Спасибо! повлияло то что label убрал и оставил @@lb1 и т.д.
Автор: akaGM
Дата сообщения: 17.05.2012 01:29
priorovod
пожалуйста...
только это называется не ассемблерная вставка, а спец.функция на BASM'e

MERCURY127

Цитата:
старею, видимо - 30 лет стукнуло...
а чё серпом размахиваешь? :)
Автор: blaro
Дата сообщения: 18.05.2012 12:25
Привет всем.
У меня такой вопрос почему отладчик пропускает прерывание int 21h? Приведу пример

Код:
.model small
.stack 1024
.data
mystr db 100 dup(?)

.code
start:
mov ax,@data
mov ds,ax
mov ah,0ah
lea dx,mystr
int 21h

mov ah,9
lea dx,mystr
int 21h
mov ah,4ch
mov al,0
int 21h
end start
Автор: akaGM
Дата сообщения: 18.05.2012 12:36
blaro
я плохо это помню, но вроде первым в буфере должен стоять байт длины
а после ввода ещё один байт добавляется, т.е.
перед выводом на экран надо как-то так делать
lea dx, mystr+2
глянь, может в этом дело...

да и по 21/09 про завершающий $ не забывай...
Автор: blaro
Дата сообщения: 18.05.2012 13:32
akaGM

Цитата:
я плохо это помню, но вроде первым в буфере должен стоять байт длины
глянь, может в этом дело...

Хм... добавил следующие строки

Код:
LEA DX,STRING ;DS:DX указывают на адрес строки
MOV BX,DX ;пусть BX тоже указывает на строку
MOV AL,51 ;установка длины строки (+1 для CR)
MOV [BX],AL ;посылаем в 1-й байт дескриптора
MOV AH,0AH ;номер функции
INT 21H ;получаем строку
Автор: akaGM
Дата сообщения: 18.05.2012 14:16
blaro
значит так...

21/0аh
вход
ds:dx=адрес буфера, первый байт=размер буфера
выход
ds:dx=адрес буфера, первый байт=размер буфера, второй=количество реально введённых байт
Автор: blaro
Дата сообщения: 18.05.2012 14:51
Значит строку надо объявлять так?
mystring db 100,100 dup(?)
Автор: akaGM
Дата сообщения: 18.05.2012 14:57
я бы вообще вот так:
mystring db 100,100, 98 dup('$')
Автор: MERCURY127
Дата сообщения: 18.05.2012 14:58
Нет. Так: buf db 82, ?, 80 dup (?), а можно и еще красивее, но с телефона лень писать
Автор: bomzzz
Дата сообщения: 18.05.2012 15:01
если ноль оставить или ? что одно и тоже, то программа еще UPX-ом будет сжиматься
Автор: akaGM
Дата сообщения: 18.05.2012 15:05
при dup('$') при однократном прогоне не нужно будет высчитывать и вписывать $ для 21/09
типа оптимизация...
Автор: wedl
Дата сообщения: 18.05.2012 15:12

Подскажите пожалуйста как лучше реализовать приведенный мной ниже алгоритм шифрования:
bres = (bsrc ROL (i mod M)), где bsrc – i-ый байт кодируемого файла, bres – i-ый байт в результирующем файле, полученный в результате кодирования, M – параметр алгоритма, целое число,
задаётся пользователем и лежит в пределах 0...9, i – номер позиции кодируемого
байта в кодируемом файле, отсчитанный от начала файла, ROL – операция
циклического сдвига влево, mod – операция взятия остатка от деления.
Автор: akaGM
Дата сообщения: 18.05.2012 15:27
а в чём проблема?
как написано, так последовательно и реализуй...
все операции примитивные и существуют в ассемблере...
Автор: bomzzz
Дата сообщения: 18.05.2012 15:31

Цитата:
типа оптимизация...

а понил. обычно при записи в строку указатель сразу на конец показывает, разве задом наперед если ее заполнять
Автор: wedl
Дата сообщения: 18.05.2012 15:46
akaGM
проблема в том что до этого я делал шифрование/дешифрование методом перестановки бай и вышло как то не очень.

http://dl.dropbox.com/u/56949969/tail.asm вот исходник

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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