Member
Статус: Не в сети Регистрация: 15.02.2009 Откуда: Лангепас
A1exander Если уж начал заниматься ASMом - изволь и "саночки потаскать". Литературы в И-нете по этой теме море. И кодировки, и прерывания BIOS и DOS, и работа с аппаратурой напрямую, через регистры, и пр. - и ВЫ увидите насколько силён ASM, на нём (раньше, сейчас и до шелл-кодов дошло) писались вирусы, антивирусы, ОС.
Пожалуйста - не поленитесь , и в будущем это ВАМ зачтётся
Junior
Статус: Не в сети Регистрация: 15.10.2009 Откуда: от туда
еще одна нерабочая прога. уже который час над ней бьюсь. ; должна выводить строчку задом наперед .model small .stack 100h .code start: mov ax,DGROUP mov ds,ax mov ah,3fh mov bx,0 mov cx,maximum_string_length mov dx,offset stringtoreverse int 21h and ax,ax jz done mov cx,ax push cx mov bx,offset stringtoreverse mov si,offset reversestring add si,cx dec si reverseloop: mov al,[bx] mov [si],al inc bx dec si loop reverseloop pop cx mov ax,40h mov bx,1 mov dx,offset reversestring done: mov ax,4C00h int 21h .data maximum_string_length EQU 1000 stringtoreverse db maximum_string_length dup (?) reversestring db maximum_string_length dup (?) end start
Junior
Статус: Не в сети Регистрация: 15.10.2009 Откуда: от туда
мне не лень, просто очень мало времени для досконального изучения ассемблера. Слишком много более важных вопросов. Впрочем если вам несложно скажите в какой ИМЕННО книге стоит прочитать о данной функции (выбора много глаза разбегаются)
Поисковый запрос int 21h 3fh IMHO позволяет получить достаточно информации. Можно почитать что-нибудь типа Ralf Brown's Interrupt List. В общем-то информации нужно немного - входное состояние и выходное состояние регистров/флагов. И должен быть осмысленный анализ этой информации.
Junior
Статус: Не в сети Регистрация: 15.10.2009 Откуда: от туда
Извините, это сново я) Подскажите пожалуйсто как производить арифметические действия с переменными. обьявляю переменные .data m4 EQU 7f45h m5 EQU 18ah Но арифметические действия с ними почему-то невозможны. С регистрами получается, с элементами массива тоже, а вот переменные не хотят складываться вычитаться и тд. Вот пример программы которую я написал (она работает, но здесь мне пришлось создавать массив)
Advanced member
Статус: Не в сети Регистрация: 16.11.2006 Откуда: Всегда!
A1exander писал(а):
Как сделать подобное, но с помощью переменных?
Так ты уже и сделал. А это -
Код:
.data m4 EQU 7f45h m5 EQU 18ah
директивы ассемблеру и они сами в код не транслируются. К тому же определяющие константы, а не переменные (здесь). Проименуй свой "массив" поэлементно и будет то, что ты хотел.
Junior
Статус: Не в сети Регистрация: 15.10.2009 Откуда: от туда
Я же говорю мне не нужен массив, я необходимо сделать тож самое но с помощью переменных - (КОНСТАНТ) если вам будет угодно. Создав эту переменную (константу) с помощью директивы EQU не получается складывать данные константы непосредственно! Возможно вместо EQU нужно использовать другую директиву?
Advanced member
Статус: Не в сети Регистрация: 10.04.2003 Откуда: Москва
У тебя каша. EQU означает, что вместо m4 _В_САМ_ТЕКСТ_ будет подставляться 7f45h Т.е. запись mov ax,m4 будет транслироваться ассемблером в mov ax,7f45h
Что значит работа с переменными?
init_value = 33 .data variable1 dw init_value variable2 dw 33 Обе переменные инициируются одним и тем-же числом 33
Что тебе надо делать с переменными? Простейшие операции: mov word ptr [var1],1234 ; число в переменную mov eax,dword ptr [var2] ; переменную в регистр add al,byte ptr [var3] ; регистр + переменная mul dword ptr [var2] ; умножить на переменную
Переменные: var1 - слово var2 - двойное слово var3 - байт
p.s. И не делай так: mov [mass],77h mov [mass+1],78h mov [mass+2],01h Применяй разную размерность. Для данного, исключительно глупого, примера (по 3 байта никто не оперирует): mov word ptr [mass],7877h mov byte ptr [mass+2],01h
При записи числа в переменную ВСЕГДА ОБЯЗАН указывать разрядность операции. 'ptr'. Впрочем, даже сам ассемблер это не пропустит.
Member
Статус: Не в сети Регистрация: 11.01.2006 Откуда: Таганрог
Ребят, помогите с заданием, МК- AVR. Задание: Написать программу сложения 2х двуразрядных [url=http://ru.wikipedia.org/wiki/Двоично-десятичный_код]BCD числа[/url]. С теорией я разобрался, предодаватель сказал, что нужно делать примерно следующее:
1. Обнулить старшую тетраду обоих чисел (предварительно скопировав их в др. регистр) 2. Сложить побитно, если полученная сумма больше 0b00001010 (9-ти), то прибавить 0b00000110 (6-ть) 3. Проверить 5ый бит, если он установлен- перенести его в старший разряд 4. Сделать все аналогично с старшей тетрадой (переполнение не учитывать) 5. Поменять тетрады местами
Все числа изначально задаются в двоичном виде.
Вот руководство- http://www.atmel.ru/Articles/Atmel11.htm
А теперь по пунктам: 1) CBR- сбросить биты в регистре, как применить эту инструкцию ума не приложу, Пишу- CBR R16, ???? 2) я думал применить ADD, т.е. например ADD R16,R17 ; 0b00000101+0b00000001, т.е. 5+1=6 3) Какой командой проверить 5ый бит?
5) Меняет местами вроде бы команды swap
В задании ничего не сказано куда выводить результат, пусть это будет к примеру регистр R20, не важно, НО как заставить AVR Studio показывать именно то, что нужо? К примеру после всех манипуляций получится 0b01010011 в двоично-десятичном коде (53 в десятичном), как сделать, чтобы в регистре R20 было значение именно 53, а не 83?
Буду рад любой помощи!
Последний раз редактировалось Kserion 21.12.2009 20:35, всего редактировалось 1 раз.
Junior
Статус: Не в сети Регистрация: 15.10.2009 Откуда: от туда
serj Большое спасибо за информацию, но у меня все равно не получается вот пример
Код:
.model small .stack 100h .code start: mov bh,66h mov dl,22h sub bh,dl sub bh,20h mov cl,bh mov ax,6dh sub m4,ax sub byte ptr m4,byte ptr m5 sub m4,1h mov dx,m4 int 21h .data m4 dw 7f45h m5 dw 18ah end start
непойму что нетак. пишет Illegal memory reference (Недопустима ссылка на память) "Операнд команды содержит ссылку на адрес памяти, что недопустимо для данного операнда." -эту строчку не могу осмыслить. Пожалуйста разжуйте мне касательно этого вопроса.
Advanced member
Статус: Не в сети Регистрация: 10.04.2003 Откуда: Москва
"sub byte ptr m4,byte ptr m5" круто Во-первых, в х86 нет, принципиально нет, инструкций память-память. Во-вторых, какая разрядность у переменной m4 и у переменной m5?
p.s. После иструкции "int 21h" - кстати какой? - должна идти команда выхода из программы. Посмотри список по int 21, там должна быть такая.
Junior
Статус: Не в сети Регистрация: 15.10.2009 Откуда: от туда
serj Во-первых Можно ли в ассемблере производить математические операции непосредственно с переменными? Если ДА, то КАК? Во-вторых переменные m4 и m5 - 16-ричные числа...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения