Страница 2 из 2
Re: начинающий ассемблерист или как там...
Добавлено: 24 фев 2007, 05:37
Oleg_Rus
теперь матюгается по-другому:
Invalid Combination of opcode and operands
mov al, a
Re: начинающий ассемблерист или как там...
Добавлено: 25 фев 2007, 14:53
somewhere
Регистр AL - 8-разрядный, а значит и ячейка памяти по адресу A должна быть тоже восьмиразрядной, а именно типа byte или shortint. Если она Integer, тогда стоит определится что именно надо - если только старший или младший байт, то
mov al, byte ptr a или mov al, byte ptr a+1
в другом случае нужно загружать в 16-разрядные регистры. Типа AX, BX и т.д.
А вообще программировать на ассемблере нужно начинать ознакомившись с архитектурой процессоров семейства x86, их структурой регистров и организацией памяти. Изучив паскаль переход на ассемблер покажется переходом с автомобиля на самокат, и как верно сказал автор моей первой прочитаной книги о ассемблере для Z80 - "писать программу на ассемблере все-равно что высекать дом в скале при помощи напильника", потому сам язык наипростейший, если известна внутренняя организация каждого узла железа и ОС.
Re: начинающий ассемблерист или как там...
Добавлено: 15 мар 2007, 15:20
Metixa
Прошу обьясните:
1. почему установливается флаг CF когда происходит напр. 1-2, когда все решаетсья в диапазоне до 255, и приомник регистр al?
2. мой масм по моему не видит разницу между sbyte и byte, sword и word, и т.д. почему..?
благодарью...!!!
Re: начинающий ассемблерист или как там...
Добавлено: 15 мар 2007, 17:11
somewhere
" писал(а):1. почему установливается флаг CF когда происходит напр. 1-2, когда все решаетсья в диапазоне до 255, и приомник регистр al?
Не совсем понял вопроса. Трактую как понял:
"Почему устанавливается флаг CF при вычитании большего числа из меньшего, если результат получается в диапазоне 0 - 255?"
Ответ:
- Как нас учили в школе при вычитании столбиком на листочке, например: 23 - 7. Так как 7 больше 3-ех, то происходит как бы "заем" единички у двойки и вычитание идет 13 - 7. Так же и здесь, флаг переноса символизирует о том, что при вычитании пришлось "занять" виртуальную единичку. Можно сказать - произошел выход за пределы допустимого диапазона регистра(памяти). Иначе мы никогда бы не узнали какое число больше, а какое меньше. Как известно, в командах сравнения CMP происходит та же операция SUB - но только результат этот никуда не записывается - изменяются лишь флаги. Потому при такой команде:
Mov al, 20
Cmp al, 30
происходит вычитание 30 из 20 - но результат никуда не запишется. Флаг CF в этом случае будет установлен в 1-цу и нам станет известно о результатах сравнения.
" писал(а):2. мой масм по моему не видит разницу между sbyte и byte, sword и word, и т.д. почему..?
благодарью...!!!
Мне не известны такие типы, если не хватает обычных byte, word, dword, qword, tword - то вам тогда нужен не ассемблер, а Basic или еще что-то уровнем повыше.
Re: начинающий ассемблерист или как там...
Добавлено: 16 мар 2007, 01:10
Metixa
вот как я думаю:
когда происходит 1-2 машина работает так:
0000 0001
-
0000 0010
т.е. 0000 0010 инвертируется и прибавляется 1, значит
0000 0001
+
1111 1110
---------------
1111 1111 а где нам понпдобилься добовочная 1? только когда прибавляли 1 инвертированного 1111 1101 в младшем регистре, ????
Но сейчас я лучше запутался:
постарался представить что происходит бинарно кагда 3-1 (когда CF=0) но у меня почему то понадобился вирт. 1.. вот так:
0000 0011 -- 3
-
0000 0001 --1
=
0000 0011 --3
+
1111 1111 "-1"
-----------------------
1 0000 0010 --2
поможете?
а что касается типу sbyte, в книжке прочитал, что когда обьявляем со знаком т.е. sbyte (signbyte) тогда диапазон -128 - +127 , но если запишу:
.data
x1 sbyte 130
.code
mov al, x1
почему не выдается ошибка???? al же 8 регистровый что тратится на 256 число с -128 до +127, жду ответа и очень благодарью!!!!!!!!!!
Re: начинающий ассемблерист или как там...
Добавлено: 16 мар 2007, 01:52
Ramzey
Быстрее всего для МАСМ типы вроде sbyte введены для удобства восприяти, т.е. sbyte=byte (что естественно с точки зрения ассемблера), и транслятор не проверяет числа таких типов на выход из байтового диапазона. Возможно такая проверка (-128..127) в МАСМ вкючается отдельно с помощью ключа и т.п.
Re: начинающий ассемблерист или как там...
Добавлено: 16 мар 2007, 10:24
somewhere
Проблема ваша в том, что вы не до конца понимаете системы счисления - тогда никаких вопрос не возникало бы. Вкратце объясню. Суть системы счисления N в том, что число записывается с использованием N символов, каждый символ имеет свою позицию и называется разрядом. С математической точки зрения любое Х представимо в N-системе счисления в виде
Х = A0*N^0 + A1*N^1 + A2*N^2 + ...
На примере, число 59 в 10-чной системе счисления представимо:
29 = 9*10^0 + 2*10^1
В 2-ой системе:
29 = 1*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4 = 1 + 0 + 4 + 8 + 16
Теперь вмпоминаем вычитание столбиком, которому учили в школе. Это правило распространяется на любые системы счисления.
Возьмем для примера разность 34 - 18
34
18
--
Четыре меньши восьми, занимаем 1-цу у следующего разряда (3), считаем 14 - 8 = 6, пишем 6. Идем дальше поразрядно
У тройки заняли 1-цу, стало 2, 2 больше 1, займа нет, считаем 2 - 1 = 1, пишем
Получаем ответ: 16
В двоичной системе, преславутая разница 1 - 2
00000001
00000010
Считаем столбиком, порязрядно(побитово) - примерно также как это делает процессор на своих транзисторах.
Бит 0: 1 больше 0, займа нет, 1 - 0 = 1, пишем 1
Бит 1: 0 меньше 1, заем у Бита 2, считаем 10 - 01 = 1 (вкратце 0 - 1 = 1), пишем 1
Бит 2: был заем, вычет 1-цы = (0 - 1) - 0, 0 меньше 1, заем у Бита 3, 0 - 1 - 0 = 1
Бит 3: был заем, вычет 1-цы = (0 - 1) - 0, 0 меньше 1, заем у Бита 4, 0 - 1 - 0 = 1
...
...
Бит 7: был заем, вычет 1-цы = (0 - 1) - 0, 0 меньше 1, нет битов для займа = установка CF=1, 0 - 1 - 0 = 1
Результат: 11111111
Насчет sbyte - это тоже самое что и byte, просто это сделано для нас, людей. Чтобы мы посмотрели на код и знали, что переменная может быть отрицательной. Чтобы в программе компилятор сам генерировал код вместо Mul ebx - ставил Imul ebx. Надеюсь не надо объяснять разницу этих комманд. Компилятор наверняка имеет ключ на проверки диапазонов таких псевдо-типов.
Вообще byte можно интерпретировать по разному. Есть определенный стандарт знаковых чисел, принято считать, что самый старший бит (в этом примере - 7-ой) является знаковым. Потому число 11111111 можно читать по разному, можно как беззнаковое 255, а можно как знаковое -1. Также число 130 = 10000010, беззнаковое 130, знаковое: 130-256 = -126. Поэтому нет ошибки в присваивании типу byte числа в диапазоне 0 - 255. Даже если написать
a db -2, компилятор автоматически запишет в переменную число 254. Гланое это как интерпретировать само число. Мой совет - используйте обычные типы, чтобы не было потом вопросов, типа
- "Я ему пишу Mul ebx - а он считает неправильно и в регистре Edx почему-то $FFFFFFFF"
Re: начинающий ассемблерист или как там...
Добавлено: 26 апр 2007, 15:28
Sergey_
Гугли в сторону "Виктор Юров, Учебнег" , без знания архитектуры CPU, адресации памяти - далеко не уедешь.
Еще посети сайты (в хорошем настроении, конечно):
-
http://kalashnikoff.ru/
-
http://wasm.ru/