Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > почему ругается компилятор????


Автор: susanin 14.2.2007, 17:11
у меня в программе заданы значения 
Код

x   db 37d
   y   db 4d
   z   db CFh
   res db ? 
   res1 db ?


но потом когда я их применяю в программе 
Код

Sumres1 proc
    add al,x
    add al,z
    not x
    add al,x
    mov res1, al
    
    ret
Sumres1 endp

компилятор начинает ругаться на неизвестный символ CFh.... как ему объяснить что это число в 16сс????

Автор: JAPH 14.2.2007, 17:29
Поставить перед числом 0:
Код
z db 0CFh

Автор: susanin 14.2.2007, 17:38
JAPH, спасибо"! а может тогда скажете заодно, как сделать из положительного числа отрицательное? и куда девается старший разряд числа, если при вычислении получается больше чем двухразрядное число (например 163, а в память записывается только 63). это так и должно быть, если нет то что надо сделать?

Автор: JAPH 14.2.2007, 18:54
В десятичной записи числа можно просто поставить минус: -20.
Компьютер представляет отрицательные числа в дополнительном коде (строго говоря, положительные тоже, но для положительных дополнительный код совпадает с обычным двоичным представлением - прямым кодом). Получается он так: берётся модуль числа (для -20 это 00010100b), инвертируется (11101011b) и инкрементируется (1110100b). Заметьте, что старший бит есть 1 - она-то и показывает отрицательный знак числа. Так что объявление a DB -20 эквивалентно a DB 0Е4h
Сделать из положительного отрицательное - NEG AX.
При вычислениях с использованием 8битовых регистров все действия производятся по модулю 256, если вдруг число превосходит эту границу, его старшая часть усекается и OF=1, это так и надо. Не хватает однобайтового диапазона - вам никто не мешает использовать 16битные регистры.

Автор: susanin 14.2.2007, 19:03
JAPH, если не сложно, объясните пожалуйста, как использовать 16 битные регистры (что писать в коде) и еще насчет отрицательных чисел... почему то, когда я отнимаю от числа число (прибавляю отрицательное) в ответе получается не то, что должно....а именно отличается на 1... вот мои числа 
x   db 37d
y   db 4d
 а вот то что я делаю...
mov al,x
   imul y
   call Sumres1

Код

Sumres1 proc
    add al,x
    not x
    add al,x
    add al,0CFh
    mov res1, al
    
    ret
Sumres1 endp

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

Автор: JAPH 14.2.2007, 19:31
Итак,
Код

mov  al, x ;присваивает AL значение 37
imul y     ;умножает AL на y, результат = 148 в AX
;Входим в процедуру
add  al, x ;прибавляет к AL 37, то есть в результате 185
not  x     ;в памяти инвертируется x, то есть вместо 37 = 00100101b в x будет 11011010b = 218
;может, вы хотели NEG X?
add  al, x ;прибавляет к AL=185 число 218, что по идее равно 403, но из-за переполнения AL = 147
add  al, 0CFh ;прибавляет к AL ещё 207, что приводит к AL=98
mov  resl, al ;копирует AL в resl.

А что непонятного с 16битными регистрами? Вы не знаете, какие они есть? Или не знаете, какие команды ими оперируют? Вы же свободно обращаетесь с 8битными! Вас не должны пугать команды
Код

mov  ax, 4C00h
int  21h

AX - нормальный 16битный регистр.

Автор: susanin 14.2.2007, 19:36
JAPH, просто я как то раз попробовал применить в этом примере 16 битные регистры, но компилятор выдал много ошибок...видимо я чтото не так сделал...буду пробовать еще! спасибо! а насчет NEG спасибо! наверно из за этого и получался неверный ответ! сразу тогда для большего развити я задам вопрос... smile  а какую функцию выполняет NOT????

Автор: piritus 14.2.2007, 20:08
not инвертируе все биты числа, находящегося в передаваемом ему параметре и возвращает их туда же

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)