2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 assembler не могу разобраться с исправлением ошибки
Сообщение17.03.2014, 16:51 


26/11/11
134
Нужно написать программу, в которую задаются параметры a,b,i. И по соотношениям a с b вычислить значения i1 и i2 . Есть 2 системы и на них накладываются одинаковые условия
$$
i1=\begin{cases}
5+4*i,&\text{если $a>b$;}\\
4*i-10,&\text{\в другом случае.}
\end{cases}
$$
$$
i2=\begin{cases}
3*i-4,&\text{если $a>b$;}\\
3*(i+1),&\text{\ в другом случае.}
\end{cases}
$$
Код:
   TITLE   LAB5
data segment   
  a   DB 1
  b   DB 3
  i   DB 2
  i1    DB 0
  i2    DB 0
  auth   DB 'IVAN','$'
  mess   DB 'NAZMITE KNOPKU DLY VIHODA  $'
data ends
code segment
    assume cs:code, ds:data
begin:
   cmp a,b
   jnge M2; если меньше или равно
   jg M1; если больше
M1:
   mov al,i
   imul al,4; запись в младший регистр, умножение 4*i
   add al,5
   mov i1,al; конечный результат первой функции
   mov al,i
   imul al,3
   sub al,4
   mov i2,al; запись значения i2=3*i-4
   jmp exit
M2:
   mov al,i
   imul al,4
   sub al,10
   mov i1,al; запись значения i1=4*i-10
   mov al,i
   add al,1
   imul al,3; результат i2=3(i+1)
   mov i2,al
   jmp exit
exit:
   mov ax,4c00h
   int 21h
code ends
END begin

с осальными ошибками поборолся, но вот выдаёт сейчас 5 ошибок,
illegal memory reference
imul al,4; запись в младший регистр, умножение 4*i
и остальные ошибки
Extra characters on line
imul al,3
imul al,4
imul al,3; результат i2=3(i+1)

И все ошибки связаны с командой перемножения, что заставляет задуматься о том, что я, похоже не верно понял как ей пользоваться, но в турбодебагере пробивал, более адекватно работала эта команда если писал вместо al, ax, но как я понимаю это одно и тоже почти., если наблюдать за отладкой. Пробовал лишнюю строку с перессылкой данного в регистр al не делать, и использовать imul как написано на многих сайтах, как
Код:
mov     bx,186
        imul    eax,bx,8

но ругается на то, что он не знает такого аргумента как eax... Если что, я работаю с турбодебаггером и компилирую пошагово текстовый файл

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение17.03.2014, 18:28 
Заслуженный участник


04/05/09
4587
Вариант с умножением на непосредственное число появился в процессоре 386, тогда же, когда и 32-х битные регистры eax.
Ваш код исполняется, судя по всему, на базовом наборе инструкций 8086. Там умножать можно только аккумулятор (al, ax) на число из регистра или памяти. Константу придётся положить или в отдельную переменную памяти, или загрузить сначала в регистр.
Либо переключится в 32-битный режим i386, но это более сложная тема. Там многое по-другому.

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение17.03.2014, 18:40 


26/11/11
134
venco в сообщении #837948 писал(а):
Вариант с умножением на непосредственное число появился в процессоре 386, тогда же, когда и 32-х битные регистры eax.
Ваш код исполняется, судя по всему, на базовом наборе инструкций 8086. Там умножать можно только аккумулятор (al, ax) на число из регистра или памяти. Константу придётся положить или в отдельную переменную памяти, или загрузить сначала в регистр.
Либо переключится в 32-битный режим i386, но это более сложная тема. Там многое по-другому.

спасибо, сейчас попробую

-- 17.03.2014, 19:52 --

заменил на регистр, соответствующий умножению, судя по описанию это регистр ax, к нему относят al и ah, и вот заменив эти строчки
Код:

   mov al,i
   imul al,4; запись в младший регистр, умножение 4*i

на
Код:
mov ah,4
mov al,i
imul al,ah; запись в младший регистр, умножение 4*i

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение17.03.2014, 20:26 
Заслуженный участник


02/08/11
7004
BAHOO, вторым регистром не обязательно должен быть $\operatorname{ah}$. Так что лучше поменяйте $\operatorname{ah}$ на более нейтральный $\operatorname{bl}$.

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение17.03.2014, 21:36 


09/05/10
122
Ростов-на-Дону
Код:
.386

assume   cs:code,ds:data

code   segment   use16

begin:
   mov   ax,data               ;Инициализация DS!!!!
   mov   ds,ax                 ;Обязательно!!!
        ...............
        ...............
code ends
;===============
data segment use16
        ...............
        ...............
data ends
;===============
stk segment stack use16
        ...............
stk ends
       end begin


Порядок сегментов лучше выбрать такой.

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение17.03.2014, 21:53 
Заслуженный участник


02/08/11
7004
Tod Leben в сообщении #838005 писал(а):
Порядок сегментов лучше выбрать такой.
Почему?

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение17.03.2014, 22:14 


09/05/10
122
Ростов-на-Дону
warlock66613 в сообщении #838007 писал(а):
Почему?

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

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение17.03.2014, 22:42 


26/11/11
134
Tod Leben в сообщении #838005 писал(а):

Порядок сегментов лучше выбрать такой.


кажется разобрался, но я правильно понимаю, что последнее можно опустить в моём случае?
Код:
stk segment stack use16
        ...............
stk ends


-- 17.03.2014, 23:48 --

что-то всё одно и тоже... Вот тогда ещё вопрос. Умножение на целое число впринцепи это тоже самое что и сложение. Выполнение перемножения с помощью стандартной команды будет дольше, чем я напишу цикл сложений?)

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение17.03.2014, 23:24 


05/09/12
2587
BAHOO в сообщении #838034 писал(а):
Выполнение перемножения с помощью стандартной команды будет дольше, чем я напишу цикл сложений?
А сложение - это в принципе то же самое, что и инкремент много раз. Можно умножение заменить циклом сложений, которые в свою очередь реализовать циклом инкрементов. Но не думаю, что это будет быстрее одной команды :-)

ЗЫ у вас умножение на $3$ и на $4$! На $4$ - банальный сдвиг влево на 2 бита, на $3$ = на $4$ и вычитание.

ЗЗЫ и еще, для уменьшения размеров кода - при любых условиях вам надо считать значения $3i$ и $4i$ - считайте их сразу до условий, а потом прибавляйте/вычитайте пятерки-десятки по условиям. А еще лучше до условий прибавить к обоим результатам что надо по умолчанию (первому условию), и потом только по одному условию скорректировать результаты - будет еще короче.

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение18.03.2014, 00:10 
Заслуженный участник


12/07/07
4523
BAHOO
Для i8086
1. Первая ошибка
BAHOO в сообщении #837905 писал(а):
illegal memory reference
cmp не может использовать оба операнда в памяти. Поэтому занесите одну из переменных в регистр и сравнивайте значение в памяти со значением в регистре.
Код:
mov al, a
cmp al, b

2. По поводу умножения. Вы не поняли venco. Занесите в al непосредственный операнд и умножайте на операнд в памяти.
Код:
mov al, 4
imul i
или занесите в регистры
Код:
mov al, 4
mov ah, i
imul ah


В целом, пишите подробней (для какого процессора и т.п.) и найдите в сети справочник по командам соответствующего процессора.

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение18.03.2014, 17:11 


26/11/11
134
GAA в сообщении #838059 писал(а):
BAHOO
Для i8086
1. Первая ошибка не может использовать оба операнда в памяти. Поэтому занесите одну из переменных в регистр и сравнивайте значение в памяти со значением в регистре.
Код:
mov al, a
cmp al, b

2. По поводу умножения. Вы не поняли venco. Занесите в al непосредственный операнд и умножайте на операнд в памяти.
или занесите в регистры

Исправил, вроде всё на отлично пошло, осталось проверить верно ли работает, но вот с imul я такого ни в Юрове ни на просторах интернета не встречал пока. Спасибо большое)

 Профиль  
                  
 
 Re: assembler не могу разобраться с исправлением ошибки
Сообщение19.03.2014, 16:04 
Заслуженный участник


12/07/07
4523
По поводу умножения (дополнение).
В 80186 (помимо добавления новых инструкций) была «расширена функциональность ряда инструкций» 8086, в частности, стали допустимы push, ror, shl, imul с непосредственными операндами, например, imul dr, const, и imul с тремя операндами: imul dr, s, const, где dr — 16-битный регистр, в который будет помещён результат, s — 16-битный регистр или операнд в памяти, const — непосредственный операнд. [скомпилируется imul ax, 3]

Однако imul al, 3 (из начального сообщения темы) не будет работать и на 386 (в котором допустимыми стали и 32-битные операнды в этой инструкции).

Кратко об этом можно посмотреть в главе 10 «Процессор 80386 и другие процессоры» книжки «Программа-справочник по системе программирования турбо ассемблер 2.0. Руководство пользователя. / Перевод под. ред. С.Б. Орлова» (можно нагуглить). [В нем не уделено внимание добавленной в 287 инструкции fstsw ax [которая загружает SW в регистр ax для дальнейшего выполнения условных переходов] и особенностям 387 процессора, поэтому по сопроцессору желательно читать другую документацию.] И соответственно «Справочное руководство» [там есть о новых/расширенных инстр., но слишком кратко]. Или переводы для 3 турбо ассемблера: там и о 486 процессоре есть.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group