Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на Ассемблере как общего так и конкретного характера.
 
важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...
 
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи
 
некоторые ресурсы
http://www.wasm.ru/ Самый популярный русскоязычный ресурс. https://wasm.in/
Ассемблер - книги (ASM, Assembler)
 
Просьба все большие листинги оформлять тегом more.
 
если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:42 29-11-2006 | Исправлено: akaGM, 17:44 11-06-2020
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Куда смотрят преподы?!!
как куда, сисадмины порнуху разрешили немного потянуть...
 
CallFar MACRO CAddr
    CALL  DWORD PTR CAddr
ENDM
 
:)

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 14:34 14-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127
Как я уже сказал, они на любителя. К макросам тоже бывает нужно подготавливать регистры. Из несомненных плюсов только экономия на стеке.

Цитата:
Куда смотрят преподы?!!
Да ктож их знает. Я сам асм учил, без всяких преподов.

Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 23:15 14-05-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да где ассемблер учат. только на матфаках да информатике в вузах. остальные начинают изучать ассемблер после языков высокого уровня и тащут туда привычки

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 23:17 14-05-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Yvaliko

Код:
 
dos_print macro Text
  lea dx, Text
  mov ah, 9
  int 21h
endm
 
.model large
 
.data
    CRLF db 13, 10, '$'
    welcome db "Welcome to Assembler!$"
 
.code
.startup
 
    dos_print welcome
    dos_print CRLF
 

Мы говорим о разных ассемблерах?

Цитата:
Я сам асм учил, без всяких преподов.

Я тоже но по крайней мере, хоть User Manual изучил, а заодно и англ выучил без преподов...

Всего записей: 11564 | Зарегистр. 03-08-2008 | Отправлено: 20:32 15-05-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
макросы не на любителя, а для использования в качестве... макросов
как и функции для функций...
 
не помню кем, может Кнутом, а может и Дейкстрой, доказано, что для осуществления любого алгоритма в языке достаточно ровно 3-х операторов (присваивание, if и goto), однако ж сколько контрол-операторов в современных языках?
нужно пользоваться всеми выразительными средствами языка для эффективности получаемого кода

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 10:54 16-05-2012 | Исправлено: akaGM, 10:57 16-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127
Можно сделать проще.

Код:
CRLF db 13, 10, '$'  
welcome db "Welcome to Assembler!$"  
 

меняем на

Код:
 
welcome db "Welcome to Assembler!"
             db 13, 10, '$'  
 

И можно обойтись без повторов кода  
 
Давным давно, еще в прошлом веке, попала мне некая база вирусных проявлений. Ну и я как говоится "подсел". Захотелось тоже запихнуть в бут какую нибудь красивость, хотя бы без вируса. Цель была обозначена - 512 байт. Было довольно весело выискивать лишние 2 байта в десять раз переоптимизированом коде. Ужалось все что могло ужатся. Повторы кода сводились к минимуму.
Скажу так. Есть ситуации, когда макрос ну никак не вставить. Да, исходник с ними получается компактнее, но конечный код наоборот больше. С одной стороны плюс, с другой минус. Главный минус для меня лично - макросов на все случаи жизни не бывает. Мне как то проще строчить код из головы, чем вспоминать какой тут можно использовать макрос, что бы сократить 5 строк до одной.

Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 15:36 16-05-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Yvaliko, а не подумалось, что крлф потом еще пять раз отдельно пишется, для перевода строки? Оптимизация, ага ...
 
Добавлено:
А бут сектор со сканером клавиатуры у меня тоже был, и где то еще валяется

Всего записей: 11564 | Зарегистр. 03-08-2008 | Отправлено: 15:58 16-05-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
тока хотел встрять...
что оптимизировать демо-примеры...
 
как-то давным-давно мы вмногером поспорили кто и на каком языке напишет самую маленькую прогу beep, кот. заставит пукнуть писи-хрипер
 
посоревнуемся?

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 16:31 16-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Цитата:
посоревнуемся?
У меня где то был код пищалки, как раз из старых экспериментов с бутами. Не уверен только что он в той части данных, которые я спас со старого харда.

Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 16:50 16-05-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да хоть сто раз пишеться, ты место что ли экономишь на флоппи дискете

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 16:53 16-05-2012 | Исправлено: bomzzz, 16:54 16-05-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM, "я угадаю эту мелодию с семи нот"... beep.com:
B8 07 0E CD 10 CD 20

Всего записей: 11564 | Зарегистр. 03-08-2008 | Отправлено: 16:53 16-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Цитата:
B8 07 0E CD 10 CD 20
Мда. Мой намного длиннее.

Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 17:06 16-05-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127
у меня ровно в семь раз меньше, с тем же 7-ым кодом:
beep.bat
^7
один байт...
 
язык -- досовский шелл, а других ограничительных условий не было...
это к вопросу о некорректно поставленной задачe, помнишь анек о гене и чербургене с их бюро добрых услуг?

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 17:06 16-05-2012 | Исправлено: akaGM, 17:29 16-05-2012
priorovod



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос по 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;
 

 
Проблема в следующем, делфи передает x и y в функцию iter1 через регистры eax и edx соответственно. Насколько я усвоил из найденных примеров, возврат результирующего значения функции осуществляется так же через регистр eax. При просмотре скомпилированного кода отладчиком, вызываемая функция работает верно, но перед возвратом retn компилятор дописывает mov eax, ecx. Т.е.:
 
Вызов функции осуществляется так:

Код:
 
Unit1.pas.55: x:=ord(dat[i]);
0046E3DB          mov eax,[ebp-$04]
0046E3DE          mov edx,[ebp-$08]
0046E3E1           movzx edi,[eax+edx*2-$02]
Unit1.pas.56: y:=iter1(x,y);
0046E3E6           mov edx,ebx
0046E3E8           mov eax,edi
0046E3EA           call iter1
0046E3EF           mov ebx,eax
0046E3F1           inc dword ptr [ebp-$08]
Unit1.pas.53: for i := 1 to length(dat) do
0046E3F4           dec esi
0046E3F5           jnz $0046e3db
 

Сама функция:

Код:
 
0046E358           shl eax,$08
0046E35B           xor edx,eax
0046E35D                 test dh,$80
0046E360                 jz $0046e36c
0046E362                 add edx,edx
0046E364                 xor edx,$00008021
0046E36A                 jmp $0046e36e
0046E36C                add edx,edx
0046E36E                 dec eax
0046E36F                 jnz $0046e35d
0046E371           and edx,$0000ffff
0046E377           mov eax,edx
0046E379           mov eax,ecx
0046E37B           ret  
 

 
Регистр ecx в ходе вычислений здесь вообще не задействован и каждый раз процедура выдает одно и тоже значение. Может кто подскажет, как правильно вызывать описанную функцию и что я делаю неправильно?

Всего записей: 2 | Зарегистр. 23-10-2009 | Отправлено: 18:09 16-05-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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;

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 18:26 16-05-2012
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127

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

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

Код:
welcome db "Welcome to Assembler!"  
CRLF      db 13, 10, '$'


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:53 16-05-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM, в принципе, я что то похожее и ожидал если не считать "beep.bat [1] Invaliid command" и необходимости шелла кб от 10 до 300, как 4DOS, и принять сообщение об ошибке за нужный результат - то принято
Кстати, тетрацией я называл вот это http://ru.wikipedia.org/wiki/Тетрация - для нее в фортране есть особый оператор, как для степени?
 
Добавлено:

Цитата:
 
welcome db "Welcome to Assembler!"  
CRLF      db 13, 10, '$'  
 

а каково это другому человеку распарсить? не, я не спорю - съэкономлен 1 (!!!) байт...

Всего записей: 11564 | Зарегистр. 03-08-2008 | Отправлено: 18:57 16-05-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127

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

ну да, ну да... поэтому я про анекдот и вспомнил...
нужный результат -- бип
и согласись, что bat как и ехе/сом пойдёт на любой винде, и для этого ничего с собой носить не надо...
 
 
а тетрации нет, да...
зато появились матричные операторы, хотя я в них уже не спец, тут лучше в нашем топе спрашивать...
 
 
вот и мои 5 копеек:
 
я за
 
welcome db "Welcome to Assembler!", '$'  
CRLF      db 13, 10, '$'
 
как паскалист говорю, есть write() / writeln(), я за автоном...

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 19:12 16-05-2012 | Исправлено: akaGM, 19:27 16-05-2012
Yvaliko

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Код:
dos_print welcome  
dos_print CRLF

можно обойтись просто

Код:
dos_print welcome

Всего записей: 770 | Зарегистр. 13-05-2008 | Отправлено: 19:30 16-05-2012
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127

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

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

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

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

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 19:33 16-05-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru