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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
bomzzz



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

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 22:30 29-03-2010 | Исправлено: bomzzz, 22:33 29-03-2010
Asmix

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz
А конкретнее можно, телепаты в отпуске
BIOS? DOS? Windows?

Всего записей: 45 | Зарегистр. 11-10-2005 | Отправлено: 18:50 20-04-2010
aspis

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Asmix
Еще б через месяц написали ). Раз 16 битный режим, скорее всего под ДОС, значит в прерываниях разбираться надо.

Всего записей: 87 | Зарегистр. 27-08-2007 | Отправлено: 19:23 20-04-2010
Asmix

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aspis
16-битные приложения и в винде есть
я только потом заметил, что месяц прошел
а что же сам не удосужился, раз такой умный

Всего записей: 45 | Зарегистр. 11-10-2005 | Отправлено: 19:31 20-04-2010
aspis

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

Цитата:
а что же сам не удосужился, раз такой умный  

Удосужился что? Я привел какую-никакую идею: ДОС - смотреть прерывания, отвечающие за работу с мышью; а если Win - ну например смотреть WinAPI/механизм сообщений (SendMessage). А Вы? )
Дальше с Вами спорить не собираюсь, но согласен, что задача поставлена некорректно и нужны уточнения.

Всего записей: 87 | Зарегистр. 27-08-2007 | Отправлено: 19:52 20-04-2010 | Исправлено: aspis, 20:09 20-04-2010
Asmix

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

Цитата:
Удосужился что?

судя по ответам, технические знания присутствуют, так почему же ответить товарищу bomzzz времени не нашлось

Всего записей: 45 | Зарегистр. 11-10-2005 | Отправлено: 20:22 20-04-2010
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть такой вопрос. Предистория здесь. Если вкратце, то компилятор интела известен тем, что вставляет функции проверки типа процессора,
и, в зависимости от его типа, программа подключает математические и другие функции с разным уровнем оптимизации (SSE2,SSE3,SSE4.x  и.т.д)
При этом он делает это ущербно, если ему попадается АМД процессор (пруфлинк )
 
Проблема в том, что новый компилятор интела генерирует слегка другой код  в функции проверки, и  патч  для программ больше не работает.
Я в асме не силен, а тем более в асм с 64битными инструкциями. Ниже приведены сравнения функции проверки от старого компилятора (оригинал и подправленый),
а также код функции проверки, вставляемый новым компилятором в программу.  
Прошу знающих людей посмотреть на код и обьяснить что происходит в новой функции по сравнению со старыми (оригинальной и модифицированой после патча)  
код здесь

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 14:21 21-04-2010 | Исправлено: terminat0r, 14:24 21-04-2010
ValidolX

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот то, что проверяет компилятор (до и после)
А проверяет от строку "GenuineIntel"  => "uneGIeniletn" (little endian у Intela) => 756e654749656e696c65746e
 
Старая проверка:
 
До

Код:
 
  507967:       3d 47 65 6e 75          cmp    $0x756e6547,%eax  
  50796c:       75 1b                   jne    507989 <__intel_cpu_indicator_init+0x99>  
  50796e:       8b 45 f4                mov    -0xc(%rbp),%eax  
  507971:       3d 69 6e 65 49          cmp    $0x49656e69,%eax  
  507976:       75 11                   jne    507989 <__intel_cpu_indicator_init+0x99>  
  507978:       8b 45 ec                mov    -0x14(%rbp),%eax  
  50797b:       3d 6e 74 65 6c          cmp    $0x6c65746e,%eax  
  507980:       75 07                   jne    507989 <__intel_cpu_indicator_init+0x99>  
 

 
После
 

Код:
 
  507967:       a9 00 00 00 00          test   $0x0,%eax  
  50796c:       75 1b                   jne    507989 <__intel_cpu_indicator_init+0x99>  
  50796e:       8b 45 f4                mov    -0xc(%rbp),%eax  
  507971:       a9 00 00 00 00          test   $0x0,%eax  
  507976:       75 11                   jne    507989 <__intel_cpu_indicator_init+0x99>  
  507978:       8b 45 ec                mov    -0x14(%rbp),%eax  
  50797b:       a9 00 00 00 00          test   $0x0,%eax  
  507980:       75 07                   jne    507989 <__intel_cpu_indicator_init+0x99>  
 

 
Новая
 
До

Код:
 
  52cfb8:       81 7d f0 47 65 6e 75    cmpl   $0x756e6547,-0x10(%rbp)  
  52cfbf:       75 16                   jne    52cfd7 <__intel_cpu_indicator_init+0x97>  
  52cfc1:       81 7d e8 69 6e 65 49    cmpl   $0x49656e69,-0x18(%rbp)  
  52cfc8:       75 0d                   jne    52cfd7 <__intel_cpu_indicator_init+0x97>  
  52cfca:       81 7d e0 6e 74 65 6c    cmpl   $0x6c65746e,-0x20(%rbp)  
  52cfd1:       75 04                   jne    52cfd7 <__intel_cpu_indicator_init+0x97>  
 

 
После
<code>
Думаю тут ясно что и где менять?
</code>

Всего записей: 1719 | Зарегистр. 22-07-2001 | Отправлено: 16:27 21-04-2010 | Исправлено: ValidolX, 16:34 21-04-2010
yurassik77



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Шапка темы ставит в тупик. Потому как хочется написать, чтоб кто-нибудь объяснил, что делаю не так и в тоже время, это же контрольная... Писать - не писать, вот в чем вопрос!
Сильно не пинайте!
Есть выражение на Pascal:
...  
i:=1;
k:=1024;
repeat
       if ((i*i+k) or 9)=3 then i:=i*(i+k) else k:=k-i
until i>k;
...
Нужно в программе на Pascal совместить решение на Pascal и Assembler и ответы должны сходиться соответственно.
Реализовал программу так:
Подробнее...
Помогите пожалуйста! Укажите на ошибки или напишите как должно быть
 

Всего записей: 2 | Зарегистр. 18-10-2007 | Отправлено: 17:10 21-04-2010
terminat0r



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

Цитата:
После  

как то так?
 

Код:
 
  52cfb8:    f7 45 f0 00 00 00 00     testl  $0x0,-0x10(%rbp)
  52cfbf:    75 16                    jne    529b87 <__intel_cpu_indicator_init+0x97>
  52cfc1:    f7 45 e8 00 00 00 00     testl  $0x0,-0x18(%rbp)
  52cfc8:    75 0d                    jne    529b87 <__intel_cpu_indicator_init+0x97>
  52cfca:    f7 45 e0 00 00 00 00     testl  $0x0,-0x20(%rbp)
  52cfd1:    75 04                    jne    529b87 <__intel_cpu_indicator_init+0x97>
 

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 18:33 21-04-2010
aspis

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
Скорее всего, если дальше еще нет проверок.
yurassik77
У вас масло маслянное ). Есть и переменная ах, есть еще регистр ах:
1) расчеты выполняете с использованием регистра, а при выводе используете переменную.
2) в ах - i; в dx - k, но операция умножения mul затирает значение в dx (если операнд 16 битный, значение умножения сохраняется в паре dx:ax)
Такой вариант (консольное приложение на Delphi только).
Подробнее...

Всего записей: 87 | Зарегистр. 27-08-2007 | Отправлено: 19:18 21-04-2010
terminat0r



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

Цитата:
Скорее всего, если дальше еще нет проверок.  

дык кажись нет их больше. Патч заводит уже программы, которые до этого отказывались работать на АМД вообще.
 
Спасибо!

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 15:33 22-04-2010
Cheery12

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребят помогите поалуста напистаь программу, или может быть кто-то уже писал, задание выглядит так: Дана матрица 10х10 типы элементов байты. Элементы матрицы знаковые числа. Матрица находится в ОП.
Найти максимальный элемент матрицы, его координаты. Вычислить следующее выражение Ai max-1, j max-1 +Ai max+1, j max+1 /2
Матрицу рассматривать как двумерный массив. Выдать на экран матрицу, минимальный элемент, его координаты и результат вычисления выражения. Результат также поместить в файл.

Всего записей: 4 | Зарегистр. 27-04-2010 | Отправлено: 15:12 27-04-2010
akaGM

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

Цитата:
важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...
 
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи  

Всего записей: 24121 | Зарегистр. 06-12-2002 | Отправлено: 16:00 27-04-2010
Cheery12

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сорри не посмотрела, вот кусочек который я более менее сделала, но проблема в том что здесь надо двумерный сделать, а у меня одномерный.
STACK SEGMENT STAK
   db 128
STACK ENDS
DATA SEGMENT
   temp db 3 dup (' ')  
   ten db 10  
   str1 dw 0
   str2 dw 1              
   col1 dw 0
   col2 dw 1
   fin_mas db 700 dup (' '), '$'
   max db '?'
   mas db 1,2,3,4,5,127,7,8,9,123,  128,12,13,13,16,17,18,14,19,20,       21,22,23,24,25,35,32,43,56,54,  23,23,54,4,123,23,23,65,63,34,  54,67,123,1,234,23,23,12,11,33,  1,2,3,4,5,6,7,8,9,10,  11,12,13,15,16,17,18,14,19,20, 21,22,23,24,25,35,32,43,56,54, 23,23,54,4,123,23,23,65,63,34,  54,67,123,1,234,23,23,12,11,33  
   file_name db 'ans.txt', 0
   max_str   db 'max= $'  
DATA ENDS
CODE SEGMENT  
ASSUME ds: DATA, ss: STACK, cs: CODE
trans proc
push cx
 
xor ax, ax
mov cx, 3
mov di, 0
mov al, mas[si]  
loop3:  
       cmp ax, 0
       je fin
       div   ten
       add  ah, 30h
       mov temp[di], ah;  
       xor   ah, ah
       inc  di
             
       loop loop3        
fin:
pop cx
ret
trans endp
 
console proc
push cx
mov cx, 3  
mov di, 2
loop4:
       mov dl, temp[di]
       mov fin_mas[bx], dl
       inc bx
       dec di
       loop loop4    
pop cx
ret
console endp
 
start:
;max
mov   cx, 100
mov   si,  0
mov   al, mas[si]
loop1:  
      cmp al, mas[si]
      ja        continue
      mov al, max[si]
       
      continue:
      inc   si
      loop loop1
 
mov max, al
 
mov   cx, 4
mov   ah, 9
mov   dx, offset max_str
int      21h
 
mov cx, 3
mov di, 0
xor ax,  ax
mov al, max  
loop9:  
       cmp ax, 0
       je    fin1
       div   ten
       add  ah, 30h
       mov temp[di], ah;  
       xor   ah, ah
       inc  di
             
       loop loop9        
fin1:
mov cx, 3  
mov di, 2
loop10:
       mov ah,  2
       mov dl, temp[di]
       int 21h
       dec di
       loop loop10    
 
 
Добавлено:
     Дана матрица 10 на 10 элементов. Работаем с ней, как с одномерным массивом, так как в памяти все строки расположены друг за другом. Сначала мы ищем максимальный элемент, проверяя в цикле все элементы массива. Далее переводим максимальный элемент в строку и выводим её на экран.  
       Поясняю что я делала.

Всего записей: 4 | Зарегистр. 27-04-2010 | Отправлено: 16:27 27-04-2010
aspis

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery12
Нету двумерных массивов, есть только одномерные. Все элементы в памяти располагаются последовательно друг за другом (упрощенно) в какой то области памяти. Программист сам решает как интерпретировать эту последовательность - хоть как одномерный, двумерный, n-мерный массив.
адрес элемента (i,j) можно трактовать
(база+(кол-во_элементов_в_строке*i+j) *размер_элемента)
у вас элементов в строке 10, размер 1 байт (db)
например 0 строка, 9 столбец: mas+(10*0+9)*1=mas+9; значение = 123
1 строка, 5 столбец: mas+(10*1+5)*1=mas+12; значение = 17.
Вообще это неплохо написано у Юрова, подробно и с примерами. Я бы дал совет - в программе расставлять комментарии, где поясняете что делает какой то код (ищет что то, сравнивает).

Всего записей: 87 | Зарегистр. 27-08-2007 | Отправлено: 17:52 27-04-2010
akaGM

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

 
ну вот, совсем другое дело...
 

Цитата:
проблема в том что здесь надо двумерный сделать, а у меня одномерный.

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

Код:
size_of_line = 10
num_lines = 10
num_elements = 10
 
 
lea si, offset array_address ; si будет скакать по строкам
 
loop_on_line:
 
  mov bx, 0 ; это будет счётчик по элементам
   
  loop_on_elements
    тут текущий элемент в текущей строке адресуется как byte ptr [si+bx]
    например
    mov al, byte ptr [si+bx]
    inc bx
  end_loop_on_elements
 
  add si, size_of_line
end_loop_on_line

а можно вообще во внутреннем цикле по-простому считать адрес
mas[bx+si*size_of_line] только с si надо быть аккуратнее...
как-то так, в общем...

Всего записей: 24121 | Зарегистр. 06-12-2002 | Отправлено: 17:57 27-04-2010 | Исправлено: akaGM, 17:59 27-04-2010
Cheery12

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хорошо спасибо, может еще кто даст совет))

Всего записей: 4 | Зарегистр. 27-04-2010 | Отправлено: 18:09 27-04-2010
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Скажите пожалуста, есть ли в асме знак табуляции как в Си и как перейти на новую строку? Мне надо распечатать список и чтоб было по столбикам все.

----------
Оптимистично смотрю на мир глазами убийцы.

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 14:21 28-04-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
blaro
это смотря какими функциями ты собираешься пользоваться...
например, если 9-ой функцией 21-ого прерыванием ДОС, то символ $ означает конец записи и переход на новую запись
 
а так все теже коды, что и в Си: 0ah, 0dh и табуляция 09h

Всего записей: 24121 | Зарегистр. 06-12-2002 | Отправлено: 14:27 28-04-2010 | Исправлено: akaGM, 14:28 28-04-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 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