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

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



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго времени всем! Я тут программу написал, только не знаю правильно или нет.
Программа должна рассортировать числа в массиве от меньшего к большему, т.е. в возростающем порядке.
Вот код:

Цитата:
 
name lab6t5
data segment
a db 12,3,4,16,17,2,1,8,21,5
n db 9
data ends
 
sseg  segment stack
 dw 100h dup(?)
sseg  ends
 
code segment
    assume cs:code, ds:data, ss:sseg
start:
    mov ax ,data
    mov ds, ax
    mov si,0
    mov cl,n
    xor ax,ax  
lp1:    mov al,a[si]
    mov di,si
    mov ch,cl  
lp2:    cmp al,a[di]
    jns swap
    inc di
    dec ch
    jnz lp1
    jmp lp1
swap:    mov ah,a[di]
    mov a[di],al
    mov al,ah
    inc di
    dec ch
    jnz lp2
    mov ah,4ch
    int 21h
code ends
end start
 

Проверьте пожалуйста, я правильно написал? Писал на асме 8086
 
 
Добавлено:
Да, еще один вопрос. У меня винда 7 х64 стоит. В какой рабочей среде можно писать программы на асме 8086?

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

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

Цитата:
я правильно написал?

с точки зрения синтаксиса?
правильно...
а с точки зрения логики -- сильно сомневаюсь...
1)  адресация a[si] и a[di], а где изменение индекса si?
 
2)
  jnz lp1
  jmp lp1
бессмысленно, т.к. всегда попадаешь на lp1 и как результат -- мёртвый зависон...
 
3) на "больше-меньше" сравнивают не знак jns
  cmp al,a[di]
  jns swap  
a jl ("джамп иф меньше"), jg ("джамп иф больше") или лучше для беззнаковых ja/jb ("джамп иф выше/ниже")
 
разбирайся...

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 09:43 15-01-2010 | Исправлено: akaGM, 09:52 15-01-2010
blaro



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

Цитата:
1)  адресация a[si] и a[di], а где изменение индекса si?  

Действительно его нет.

Цитата:
2)
  jnz lp1
  jmp lp1
бессмысленно, т.к. всегда попадаешь на lp1 и как результат -- мёртвый зависон..

Здесь не доглядел. Надо будет удалить один.

Цитата:
3) на "больше-меньше" сравнивают не знак jns
  cmp al,a[di]
  jns swap  
a jl ("джамп иф меньше"), jg ("джамп иф больше") или лучше для беззнаковых ja/jb ("джамп иф выше/ниже")  

Ты не поверишь! Нам препод запрещает (пока) использовать jl и jg. Он хочет, чтоб мы писали просто js, jns, jc, jnc и т.д. Это все для того чтобы лучше понять как изменяются флаги. Так что будем писать так.  
 

Цитата:
а у тебя что, компилятора нет?

У меня есть для вин ХР 32 бита, а для вин 7 64 бита нет. Вот ищу компилятор.

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

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

Цитата:
Ты не поверишь! Нам препод запрещает

гы, правильна
"научитесь плавать, тогда и воды в бассейн нальём!"
 
тогда уж не
 cmp al,a[di]
 jns swap
а
 sub al, byte ptr a[di]
 jns swap

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 15:14 15-01-2010
blaro



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

Цитата:
гы, правильна
"научитесь плавать, тогда и воды в бассейн нальём!"
 

Какое "плавать"? У нас на курсе люди даже ползать не могут. А ты "ПЛАВАТЬ"!!
 
А разве cmp не производить вычитание?

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

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

Цитата:
А разве cmp не производить вычитание?

да, конечно, производит, это я уже плавать разучился...

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 15:59 15-01-2010
meth2010

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Люди помогите пожалуйста  
 
написать программу,организующюю пользовательский стек, занимающий фиксированую область размером и K байт.Каждая ячейка стека замиет 1 байт.Написать программу реализующую,занесения элемента в пользовательский стек.Указатель отслежующий вершину стека,адрес начала,длина стека k и код ошибки при переполнении стека, передаются соответственно через регистры di,bx,cx,idx.

Всего записей: 1 | Зарегистр. 23-01-2010 | Отправлено: 10:55 23-01-2010
Puks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня не стоит задача писать на ассемблере. Задача - в чтении дампов памяти при крэше Домино. Поэтому и хотелось бы разобраться как данные заносятся в память, чтобы правильно их читать из дампа.
 
В одном руководстве приведен следующий пример.
 
Sample C Source Code:
void MyStack(long overLength)
{
char myArray1[32]="This is array1";
char myArray2[32]="This is array2";
char myArray3[32]="This is array3";
long arrayLength=32;
char * buffer=(char *)0x12345678;
long bufferLength=arrayLength;
DWORD dw1=10;
DWORD dw2=11;
DWORD dw3=12;
static DWORD dwStatic=100;
bufferLength=arrayLength;
buffer=new char[bufferLength];
memmove((void*) 0xfffffff1,(void*) 0xfffffff2,15);
delete buffer;
}
Sample Stack Trace:
############################################################
### PASS 2 : FATAL THREAD with STACK FRAMES 1/2 [mhmstand:0aac:0dc4]
### FP=0012f47c, PC=10014202, SP=0012f474, stksize=8
Exception code: c0000005 (ACCESS_VIOLATION)
############################################################
# ---------- Top of the Stack ----------
# 0012f474 02100210 0012f55c 0012f55c 100037e8 |....\...\....7..|
[ 1] 0x10014202 myDLL.memmove (fffffff1,fffffff2,f,12f6bc)
# 0012f47c 0012f55c 100037e8 fffffff1 fffffff2 |\....7..........|
# 0012f48c 0000000f 0012f6bc 02100210 7ffdf000 |................|
# 0012f49c cccccccc cccccccc cccccccc cccccccc |................|
# 0012f4ac cccccccc cccccccc cccccccc cccccccc |................|
# 0012f4bc cccccccc cccccccc cccccccc cccccccc |................|
# 0012f4cc cccccccc cccccccc cccccccc cccccccc |................|
# 0012f4dc cccccccc 00392140 0000000c 0000000b |....@!9.........|
# 0012f4ec 0000000a 00000020 00392140 00000020 |.... ...@!9. ...|
# 0012f4fc 73696854 20736920 61727261 00003379 |This is array3..|
# 0012f50c 00000000 00000000 00000000 00000000 |................|
# 0012f51c 73696854 20736920 61727261 00003279 |This is array2..|
# 0012f52c 00000000 00000000 00000000 00000000 |................|
# 0012f53c 73696854 20736920 61727261 00003179 |This is array1..|
# 0012f54c 00000000 00000000 00000000 00000000 |................|
[ 2] 0x100037e8 myDLL.MyStack (400,12fa3c,2100210,7ffdf000)
# 0012f55c 0012f8d4 10002d6f 00000400 0012fa3c |....o-......<...|
# 0012f56c 02100210 7ffdf000 cccccccc cccccccc |................|
 
==================================================================
Насколько я понял, так как это писалось для х86, то используется Little Endian.  
 
Например,
 
This = 54 68 69 73 - В коде  - 73 69 68 54
 
Но я не вижу, что это правило распространяется на числа, указатели, адреса памяти. Например,
 
========
long arrayLength=32;  
long bufferLength=arrayLength;
 
00000020
========
 
DWORD dw1=10; 0000000a
DWORD dw2=11; 0000000b
DWORD dw3=12; 0000000c
 
memmove((void*) 0xfffffff1,(void*) 0xfffffff2,15);
fffffff1 fffffff2 0000000f
========
 
 
Спасибо за помощь.

Всего записей: 1738 | Зарегистр. 17-09-2003 | Отправлено: 17:51 25-01-2010
snike555



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Думаю вопрос для этого топика: знает ли кто какие русскоязычные ресурсы на подобии http://rootkit.com/ про руткиты?

Всего записей: 380 | Зарегистр. 02-10-2009 | Отправлено: 18:44 25-01-2010
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Привет Всем! Мне надо решить задачу, а она такая:
Надо написать программу, которая получает адреса двух массивов A, B размер массива А и размер массива В. И объеденяет эти массивы в массиве С, т.е. С=(А u B). А в переменной NC будет количество элементов в массиве С. Массивы А и В содержат числа в случайном порядке (т.е не отсортированны) и длина массивов может быть разная. Максимальный размер всех 3-х массивов 100 байтов.
Дано следующее:
A db 100 dup (?)
B db 100 dup (?)
C db 100 dup (?)
NA db ? ; размер массива А
NB db ? ; размер массива В
NC db ? ; размер массива С
 
A: 1,7,1,A,2,B,A,1
B: 8,1,C,7,C,1,A,A,2,8
NA=8
NB=10
В конце программы С должен быть таким:
С: 1,2,7,8,А,В,С ; и обязательно отсортирован в порядке возрастания
 
Я хочу решить эту задачу сам (готовлюсь к экзаменам) вот только не знаю как будет лучше. Подскажите как лучше сделать.

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 20:59 02-02-2010
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
blaro
мне кажется, что в Вашем случае самым простым (а возможно и самым эффективным решением будет перенести поочерёдно элементы массивов A и B в массив C (два цикла)
и потом отсортировать массив С
код будет простым, наглядным и легко отлаживаемым.
 
 
Добавлено:

Цитата:
В конце программы С должен быть таким:  
С: 1,2,7,8,А,В,С ; и обязательно отсортирован в порядке возрастания  

или я чего-то не понимаю, или Вы ошиблись.
после объединения и сортировки массив должен быть таким:
Код:
C: 1 1 1 1 1 2 2 7 7 8 8 A A A A B C C

 

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 09:06 03-02-2010
bomzzz



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

Цитата:
 
Код:
C: 1 1 1 1 1 2 2 7 7 8 8 A A A A B C C
 

всего то нужно не записывать единицы, а суммировать единицы

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 09:18 03-02-2010 | Исправлено: bomzzz, 10:01 03-02-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если задание такое:
A =  (1,7,1,A,2,B,A,1)
B = (8,1,C,7,C,1,A,A,2,8)
С = (А u B) = (1,2,7,8,А,В,С)
то наверняка пропущено условие уникальности элементов массива
т.е. каждый элемент может входить в результат только один раз

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 12:59 03-02-2010
bomzzz



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

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 13:48 03-02-2010
akaGM

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

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 14:53 03-02-2010
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Всем спасибо! Я так решил сделать. Рассортировать оба массива в возрастающем порядке, а потом переписать значения с последующей проверкой. Если значение в массиве С уже существует, то пропускаем его, если нет то записываем.

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 15:00 03-02-2010
bomzzz



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

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 15:26 03-02-2010
SERGE_BLIZNUK

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

Цитата:
Рассортировать оба массива в возрастающем порядке, а потом переписать значения с последующей проверкой. Если значение в массиве С уже существует, то пропускаем его, если нет то записываем.

 
blaro,
в данном конкретном случае (когда массивы A и B представляют собой набор БАЙТОВЫХ величин) я полностью согласен с bomzzz - заведите промежуточный массивчик на 256 элементов (это сколько может быть значений в одном байте),
заполните его нулём.
И потом, когда берём элемент массива A (или B) просто пишем по СМЕЩЕНИЮ, равному величине элемента (т.е. если взяли 1 - смещение равно 1, взяли A - смещение равно 65 и т.д. ) и пишем в этот промежуточный массив любое отличное от нуля значение, например, ЕДИНИЧКУ
 
потом цикл от 0 и до 256 и если по этом смещению не НОЛЬ, то величину смещения пишем в массив С
 
 
 

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 15:53 03-02-2010
GeMir



Ich finde dich
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Собственно, вот - у одного хорошего человека проблема:

Цитата:
я закидываю в регистр ax нужный мне byte
потом вызываю функцию cbw
после её выполнения в регистре ax лежит мой word
соответственно, чтобы вывести эту фигню на экран
засовываю инфу из ax в dx
можно даже указать word ptr
а потом в ax кладу двойку и вызываю досовское прерывание
а оно мне фигню пишет
 
...со следующим куском кода:

Код:
assume cs:Code, ds:data
 
DATA SEGMENT
mes db "hello world", 0dh,0ah,"$"
a db ?
b dw ?
 
c dw ?
DATA ENDS
 
CODE SEGMENT
beg: mov ah,09h
mov dx,offset mes
int 21h
 
mov ah,2
 
mov a,39h
mov b,38h
 
mov dl,a
int 21h
 
mov dx,word ptr b
int 21h
 
mov dh,a
mov ah,dh
cbw   ;после выполнения этого этапа
        ;на экран выводится какая-то чушь

 
mov dx,ax
int 21h
 
mov ah,1
int 21h
 
mov ax,4c00h
int 21h
 
CODE ENDS
END beg

Буду крайне признателен за помощь с поиском ошибки.
"Чушь" выглядит следующим образом:
 

Всего записей: 10296 | Зарегистр. 15-02-2004 | Отправлено: 17:40 13-02-2010 | Исправлено: GeMir, 18:25 13-02-2010
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Я могу и ошибаться, но мне кажется что не надо конвертировать AH в АХ. Надо просто mov dx,ah.

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 18:00 13-02-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