Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 25 из 33<  1 ... 22  23  24  25  26  27  28 ... 33  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Потому, что в FAR две русские кодировки и их легко перепутать. А в VC кодировка одна.



Партнер
 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
A1exander
Если уж начал заниматься ASMом - изволь и "саночки потаскать". Литературы в И-нете по этой теме море. И кодировки, и прерывания BIOS и DOS, и работа с аппаратурой напрямую, через регистры, и пр. - и ВЫ увидите насколько силён ASM, на нём (раньше, сейчас и до шелл-кодов дошло) писались вирусы, антивирусы, ОС.

Пожалуйста - не поленитесь :writer: , и в будущем это ВАМ зачтётся :beer:


 

Junior
Статус: Не в сети
Регистрация: 15.10.2009
Откуда: от туда
:weep: еще одна нерабочая прога. уже который час над ней бьюсь.
; должна выводить строчку задом наперед
.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


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
A1exander
и как прога себя ведет?

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Junior
Статус: Не в сети
Регистрация: 15.10.2009
Откуда: от туда
Она должна вывести задом наперед строчку введенную с клавы.
А она Дает возможность ввода с клавиатуры и после нажатия enter прогарамма завершается


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
A1exander
Цитата:
jz done

так наверное, она сразу идет из-за перехода в конец... Я бы для начала почитал про int21h и убрал бы переход (чисто для теста).

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Junior
Статус: Не в сети
Регистрация: 15.10.2009
Откуда: от туда
Никто не подскажет какие строчки нужно дописать, второй день бьюсь. а инфа в инете в основном только по masm.


 

Member
Статус: Не в сети
Регистрация: 04.10.2004
A1exander
Нескромный вопрос - вам лень внимательно почитать о функции 3Fh прерывания 21h?


 

Junior
Статус: Не в сети
Регистрация: 15.10.2009
Откуда: от туда
мне не лень, просто очень мало времени для досконального изучения ассемблера. Слишком много более важных вопросов. Впрочем если вам несложно
скажите в какой ИМЕННО книге стоит прочитать о данной функции (выбора много глаза разбегаются)


 

Member
Статус: Не в сети
Регистрация: 04.10.2004
Поисковый запрос int 21h 3fh IMHO позволяет получить достаточно информации. Можно почитать что-нибудь типа Ralf Brown's Interrupt List.
В общем-то информации нужно немного - входное состояние и выходное состояние регистров/флагов. И должен быть осмысленный анализ этой информации.


 

Junior
Статус: Не в сети
Регистрация: 15.10.2009
Откуда: от туда
:slobber: Блин во я туплю, вроде не первый день в инете.
maco спасибо.
Прошу прощения у всех тех кого достал в этом топике :beer:


 

Junior
Статус: Не в сети
Регистрация: 15.10.2009
Откуда: от туда
Извините, это сново я)
Подскажите пожалуйсто как производить арифметические действия с переменными.
обьявляю переменные
.data
m4 EQU 7f45h
m5 EQU 18ah
Но арифметические действия с ними почему-то невозможны.
С регистрами получается, с элементами массива тоже, а вот переменные не хотят складываться вычитаться и тд.
Вот пример программы которую я написал (она работает, но здесь мне пришлось создавать массив)
Цитата:
.model small
.stack 100h
.code
start: mov ax,DGROUP
mov ds,ax
mov dx,126AH
mov bx,6412H
mov ax,1h
add bx,ax
add dx,bx
mov cx,dx
mov [mass],77h
mov [mass+1],78h
mov [mass+2],01h
xor ax,ax
add ax,[mass]
add ax,[mass+1]
add ax,[mass+2]
mov [mass],ax
int 21h
.data
mass dw 1,2,3
end start

Как сделать подобное, но с помощью переменных?


 

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 раз.

 

Member
Статус: Не в сети
Регистрация: 04.10.2004
Kserion писал(а):
Написать программу сожения
Добрые дети и добрые преподаватели :lol:.


Нескромный вопрос - зачем извращаться, когда можно поглядеть avr204.asm?


 

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-ричные числа...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 25 из 33<  1 ... 22  23  24  25  26  27  28 ... 33  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


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

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan