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

» Assembler

Автор: akaGM
Дата сообщения: 15.01.2010 08:43
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 ("джамп иф выше/ниже")

разбирайся...
Автор: blaro
Дата сообщения: 15.01.2010 13:51

Цитата:
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 бита нет. Вот ищу компилятор.
Автор: akaGM
Дата сообщения: 15.01.2010 14:14
blaro

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

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

тогда уж не
cmp al,a[di]
jns swap
а
sub al, byte ptr a[di]
jns swap
Автор: blaro
Дата сообщения: 15.01.2010 14:24

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

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

А разве cmp не производить вычитание?
Автор: akaGM
Дата сообщения: 15.01.2010 14:59
blaro

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

да, конечно, производит, это я уже плавать разучился...
Автор: meth2010
Дата сообщения: 23.01.2010 09:55
Люди помогите пожалуйста

написать программу,организующюю пользовательский стек, занимающий фиксированую область размером и K байт.Каждая ячейка стека замиет 1 байт.Написать программу реализующую,занесения элемента в пользовательский стек.Указатель отслежующий вершину стека,адрес начала,длина стека k и код ошибки при переполнении стека, передаются соответственно через регистры di,bx,cx,idx.
Автор: Puks
Дата сообщения: 25.01.2010 16:51
У меня не стоит задача писать на ассемблере. Задача - в чтении дампов памяти при крэше Домино. Поэтому и хотелось бы разобраться как данные заносятся в память, чтобы правильно их читать из дампа.

В одном руководстве приведен следующий пример.

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
========


Спасибо за помощь.
Автор: snike555
Дата сообщения: 25.01.2010 17:44
Думаю вопрос для этого топика: знает ли кто какие русскоязычные ресурсы на подобии http://rootkit.com/ про руткиты?
Автор: blaro
Дата сообщения: 02.02.2010 19:59
Привет Всем! Мне надо решить задачу, а она такая:
Надо написать программу, которая получает адреса двух массивов 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,А,В,С ; и обязательно отсортирован в порядке возрастания

Я хочу решить эту задачу сам (готовлюсь к экзаменам) вот только не знаю как будет лучше. Подскажите как лучше сделать.
Автор: SERGE_BLIZNUK
Дата сообщения: 03.02.2010 08:06
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
Автор: bomzzz
Дата сообщения: 03.02.2010 08:18
а по моему надо создать массив-строку длиной в количество символов в данном случае сильно смахивает что он будет длинной 16. потом прочитать по очереди все массивы и в для каждого значения массива n в созданный массив записать 1 в ячейку n. после этого преобразовать полученный массив к нужному виду. последовательность номеров всех единиц

сртировать ничего не надо - к каждой ячейке массивов будет только одно обращение

и такая задача таким алгоритмом легко решается

Цитата:

Код:
C: 1 1 1 1 1 2 2 7 7 8 8 A A A A B C C

всего то нужно не записывать единицы, а суммировать единицы
Автор: akaGM
Дата сообщения: 03.02.2010 11:59
если задание такое:
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,А,В,С)
то наверняка пропущено условие уникальности элементов массива
т.е. каждый элемент может входить в результат только один раз
Автор: bomzzz
Дата сообщения: 03.02.2010 12:48
оно по моему как раз не пропущено, так как однозначно следует из результата
Автор: akaGM
Дата сообщения: 03.02.2010 13:53
хорошая постановка задачи:
"сделай так как получишь"
Автор: blaro
Дата сообщения: 03.02.2010 14:00
Всем спасибо! Я так решил сделать. Рассортировать оба массива в возрастающем порядке, а потом переписать значения с последующей проверкой. Если значение в массиве С уже существует, то пропускаем его, если нет то записываем.
Автор: bomzzz
Дата сообщения: 03.02.2010 14:26
пример - самая лучшая постановка. объединяет массивы имеет двоякое толкование.

нафиг тебе эта сортировка. лишняя морока и лишние действия для программы
Автор: SERGE_BLIZNUK
Дата сообщения: 03.02.2010 14:53

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


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

потом цикл от 0 и до 256 и если по этом смещению не НОЛЬ, то величину смещения пишем в массив С



Автор: GeMir
Дата сообщения: 13.02.2010 16:40
Собственно, вот - у одного хорошего человека проблема:

Цитата:
я закидываю в регистр 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
Автор: blaro
Дата сообщения: 13.02.2010 17:00
Я могу и ошибаться, но мне кажется что не надо конвертировать AH в АХ. Надо просто mov dx,ah.
Автор: GeMir
Дата сообщения: 13.02.2010 17:11
blaro

Цитата:
в dx поместить ax нельзя
там ворд, а там байт
Автор: Abs62
Дата сообщения: 13.02.2010 17:15
GeMir

Цитата:
я закидываю в регистр ah нужный мне byte
потом вызываю функцию cbw
после её выполнения в регистре ah лежит мой word

Собственно, тут уже куча проблем. Команда cbw преобразует байт, лежащий в al в слово в ax с учётом знака. При чём тут закидывание байта в ah и как в восьмиразрядном регистре может лежать шестнадцатиразрядное слово - загадка.

Цитата:
соответственно, чтобы вывести эту фигню на экран
засовываю инфу из ah в dx

Как? ah - 8 разрядов, dx - 16.
Да и функция 2 int 21h выводит символ в dl, dh игнорируется.

Цитата:
а потом в ah кладу двойку и вызываю досовское прерывание
а оно мне фигню пишет

Не-е, после cbw в ah уже не двойка, там либо 0, либо 0FFh.

Что вообще сделать-то надо?
Автор: blaro
Дата сообщения: 13.02.2010 17:16
GeMir
Там кажется в АН передается номер команды а в AL адрес стороки. И CBW не надо.
Автор: GeMir
Дата сообщения: 13.02.2010 17:27
Abs62

Цитата:
Как? ah - 8 разрядов, dx - 16.

Упс, извиняюсь, не "ah" а "ax" имелся в виду.
Моя вина. "Трудности перевода".

Цитата:
Что вообще сделать-то надо?

Вот:

Цитата:
меня интересует вывод на экран word из регистра ax и конвертирование byte в word
Автор: blaro
Дата сообщения: 13.02.2010 17:36
Вот нашел как надо

Код:
mov ah,2
mov dl, адрес_строки
int 21h
Автор: Zminyty
Дата сообщения: 13.02.2010 17:37
Вот, собственно, и "хороший человек", которому требуется помощь.
Значит, рассказываю по порядку, что я хочу сделать и для чего это нужно.Изначально у меня есть 2 перменные, одна байт, вторая - ворд.Задание:нужно выполнить арифметическое действие между этими перменными, соответственно нужно привести их к одному типу.
Значит, перменную а типа байт, я кладу в al -> a, cbw -> получаем в ах наш ворд.дальше я хочу вывести это на экран, а потом уже произвести действие.т.е. я не могу просто сделать mov dx,ax int 21h ?

что именно неправильно в этом куске?

mov al,a
cbw
mov dx,word ptr ax
int 21h
Автор: Abs62
Дата сообщения: 13.02.2010 17:57
Zminyty

Цитата:
т.е. я не могу просто сделать mov dx,ax int 21h ?

Сделать-то можно, вот только результат не порадует.

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

Дык, чтобы вывести число на экран его сначала надо в строку символов преобразовать, и её уже выводить.
Вот тут есть пример, как это делается: ПРЕОБРАЗОВАНИЕ ДВОИЧНОГО ФОРМАТА В ASCII-ФОРМАТ

И не забывать задавать номер функции в ah перед вызовом int 21h
Автор: blaro
Дата сообщения: 13.02.2010 18:03
Zminyty

Цитата:
mov al,a
cbw
mov dx,word ptr ax
int 21h

1) Зачем писать CBW? Если только у тебя не отрицательные числа. Можно просто написать
mov ah,00
mov al, a

2) Зачем писать mov dx, word ptr ax? Если АХ уже 16 байтов.

Тогда делать нужно так

Код:
mov al,a
mov ah,2
mov dl,al
int 21h
Автор: Zminyty
Дата сообщения: 13.02.2010 18:11
blaro


Цитата:
Тогда делать нужно так

Код:
 
mov al,a
mov ah,2
mov dl,al
int 21h
 

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

Abs62
знаете, по ссылке уже пошли какие-то дебри ассемблера)и учитывая то, что это моя вторая лабораторная работа за 2 дня изучения ассемблера, то мне еще немного сложновато въехать в такоев общем, мне почему-то кажется, что существует более изящное решение моей проблемы
Автор: blaro
Дата сообщения: 13.02.2010 18:23
Zminyty
Никто вас за идиота не держит. Таким способом которым вы хотите сделать это невозможно. Есть другой способ, вывести строку через порт видео карты. А та ссылка которую дал вам Abs62 тоже может быть полезной, но если то что там написанно вам не понятно оставте на потом.
Автор: Zminyty
Дата сообщения: 13.02.2010 18:28
хорошо,т.е. если я не буду вывосить свой ворд из ах, потом выполню арифметическую операцию над двумя числами и запишу результат операции в дополнительную, допустим, с переменную и мне понадобится её вывести на экран.здесь придётся переводить из двоичного представления в аски?я праивльно понимаю?
т.е. если у нас есть просто число в памяти, то в каком оно виде там хранится и почему мы можем обычным способом его вывести на экран, а вот после выполнения действий над числами приходится так мучаться с переводами?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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