Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
1

Создание переменных

06.09.2010, 13:50. Просмотров 8773. Ответов 11
Метки нет (Все метки)

Здравствуйте уважаемые! Интересует синтаксис создания переменных. В других языках всё просто(я этим не хочу сказать, что какой-то язык лучше или хуже,тем более, что мне всё больше начинает нравиться Ассемблер): int x=10 или просто x=10.
Оказывается, что думал всё понял из стандартного примера кода с обычным выводом сообщения -Hello world! А надо уметь ещё и правильно память выделять! word(byte) ptr, offset и правильно адресовать!
Вообщем допустим код:
Assembler
1
2
mov ax,[perem1]  - поправьте будь ласка ув-е, т.е. правильно?  в ах я заношу значение
perem1 dw 101h
Или там надо так?: mov ax,word ptr perem1

perem1 db "hello$" - как я понял, db пишется, когда переменныя указывает на строку(на первый символ)!
А когда надо указывать dw ? Когда надо записать в 2 байта число?
perem1 dw 1000h - так правильно?
А если так?: perem1 db 1000h

Вообщем меня интересует всё, что связанно с созданием переменных, синтаксис!
Пару примерчиков, типа как выше можно?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2010, 13:50
Ответы с готовыми решениями:

Сравнения переменных
Доброе утро. Нужна Ваша помощь, форумчане. ассемблер, среда nasm 2.07 ...

Места переменных
Добрый день! Начал изучать язык ассемблера. Сейчас на этапе написания...

Перестановка переменных.
Здравствуйте. Помогите, пожалуйста, решить данное задание. Дело в том, что оно...

Изменение переменных
Я создал переменную-строку, меняю в ней первый символ, пытаюсь вывести с...

Ввод переменных
В общем мне нужно организовать на Масм ввод числа с плавающей точкой, чтобы в...

11
vital792
2003 / 1275 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
06.09.2010, 15:37 2
проще наверно сказать что в ассемблере нет переменных. db, dw, dd, dq - это директивы распределения памати
Assembler
1
2
3
mas1 db 0,1,'ab'
dw 123,1
mas2 dd 12
mas1 и mas2 это метки по которым можно обращаться к опрежеленным учатскам памяти, они потом транслируются в адреса. Массивов тоже нет. Вся память просто последовательномть байт, интерпретировать их можно как тебе удобно. например, mas db 1,2,3,4 - вроде как массив однобайтовый.
, но можно обращаться как к двухбайтовому mov ax, word ptr mas, и т.д

Добавлено через 38 секунд
немного замороченно получилось, а хотел как проще))

Добавлено через 54 минуты
Цитата Сообщение от assemb Посмотреть сообщение
mov ax,[perem1] - поправьте будь ласка ув-е, т.е. правильно? в ах я заношу значение
perem1 dw 101h
нет, в данном случае в ax заносится не значение 101h, а содержимое памяти по адресу 101h. это как в с:
C
1
2
short *perem1 = 0x101;
short p = *perem1;
Добавлено через 2 минуты
Цитата Сообщение от assemb Посмотреть сообщение
А если так?: perem1 db 1000h
а так нельзя. Если определяешь байт, то значение которым инициализируешь должно помещаться в байт, т.е <=255
1
Goodwin98
2523 / 819 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
06.09.2010, 16:20 3
Цитата Сообщение от vital792 Посмотреть сообщение
обавлено через 54 минуты
Цитата Сообщение от assemb Посмотреть сообщение
mov ax,[perem1] - поправьте будь ласка ув-е, т.е. правильно? в ах я заношу значение
perem1 dw 101h
нет, в данном случае в ax заносится не значение 101h, а содержимое памяти по адресу 101h. это как в с:
Вообще-то именно 101h и занесется в ax
0
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
06.09.2010, 16:26  [ТС] 4
Вообще-то именно 101h и занесется в ax
Только хотел так же поправить. Немного похимичив с код, всего с 3-мя строчками:
Assembler
1
2
3
4
5
...
mov ah,[perem1]               - это 
mov dh,byte ptr perem1     - и это получается одно и тоже!
perem1 db 15h
...
А почему не получается так?:
Assembler
1
mov ax,[perem1]
Я догадываюсь, что ax ведь 16 бит! а переменная perem1 определена как 8 бит!
0
vital792
2003 / 1275 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
06.09.2010, 16:31 5
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Вообще-то именно 101h и занесется в ax
извините)) поторопился
Цитата Сообщение от assemb Посмотреть сообщение
А почему не получается так?:
mov ax,[perem1]
получится, но тока прицепится следующий байт в памяти
0
Goodwin98
2523 / 819 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
06.09.2010, 16:42 6
Цитата Сообщение от assemb Посмотреть сообщение
А почему не получается так?:
mov ax,[perem1]
Я догадываюсь, что ax ведь 16 бит! а переменная perem1 определена как 8 бит!
именно.
Можно сделать так.
Assembler
1
mozx ax,[perem1]
Но только в режиме .386 и выше.
1
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
06.09.2010, 18:57  [ТС] 7
Почти разобрался. Благодарю!!! Ну чтобы закрепить знания, решил попробовать примерчик:
Код
...
mov cx,0010h                          2) цикл будет повторяться 16 р.
mov al,1

cikl proc
add al,1
mov ...?                  как правильно написать?, чтобы заполнить выделенную память цифрами от 0 до 16
;(одна догадка есть, что можно как-то прибавлять значение регистра cl к смещению!)
cikl endp

loop cikl

int 20h

perem1 db 10h dup(1)               -1) выделяем память 10h байтов
...
0
vital792
2003 / 1275 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
06.09.2010, 20:30 8
а зачем там процедура в середине цикла? Все куда проще
Assembler
1
2
3
4
5
6
7
mov di, offset perem1
xor al,al
mov cx,0010h
cikl:
inc al
stosb
loop cikl
Добавлено через 1 минуту
Цитата Сообщение от assemb Посмотреть сообщение
прибавлять значение регистра cl к смещению
cl декрементируется. В принципе можно, тока указатель установить на конец массива

Добавлено через 47 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mov cx,0010h                          ;2) цикл будет повторяться 16 р.
mov al,10h 
 
cikl proc
sub al,1
mov bx,cx ;регистр cx не используется при индексной адресации
mov [perem1+bx],al 
cikl endp
 
loop cikl
 
int 20h
 
perem1 db 10h dup(1)
вот так ты наверно хотел. Тока использование директивы proc как метки в цикле выглядит экзотично)). Хотя разницы мало - что метки, что точки входа в процедуры одинаково транслируются в адреса
1
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
06.09.2010, 22:00  [ТС] 9
Да!!! Если честно, тоже самое делал, но без bx. Наверно пару троек ячеек были вообще офигевшие, пока я тестировал их и записывал в них Благодарю!
0
vital792
2003 / 1275 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
06.09.2010, 22:09 10
тока все равно код что выше и проще и быстрее
0
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
06.09.2010, 22:09  [ТС] 11
А можно? уточнить. Почему не использовать процедуру? Чем отличается cikl: от cikl proc .
Хотелось бы уточнить, потому что ещё не вижу разницы!
0
vital792
2003 / 1275 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
06.09.2010, 22:19 12
да в общем никакой. Метки так же можно использовать как процедуры. директива proc была введена для большей читабельности, с ней удобнее организовывать процедуры. Но все равно тако код:
Assembler
1
2
3
call proc1
...
proc1:
встречается часто. А наоборот, чтоб дирестивой proc пользовались как меткой в цикле я увидел впервые
0
06.09.2010, 22:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2010, 22:19

Вычислить выражение из 3 переменных
Это моя первая программа на ассеблере, не до конца еще разобралась. Нужно...

Расположение переменных в памяти
Здравствуйте. Требуется найти значение R=K+L-M+E566 Результат записать по...

команда and при обявлении переменных
Дано обявление перемeнной var dw 100, 2 dup(-1,01b), 101h AND 0f00h насколько...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru