Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простейшие арифметические примеры 
V
    Опции темы
oshilan
Дата 6.9.2010, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.3.2010

Репутация: нет
Всего: 0



Помогите, пожалуйста, практически и наглядным образом разобраться в этом язые, написанием текста программы для решения такого примера: 8*2904+(9*2904)/92=результат разместить где-то в памяти. И желательно решить и 2-ой пример: 1993/(3*93)-6*93*403, чтоб я мог найти различия и понять что к чему. Зараннее благодарен!
PM MAIL   Вверх
Mikl_
Дата 7.9.2010, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



oshilan, 
при написании программы на ассемблере объязательно следует указывать операционную систему под которую пишется задача (DOS, Linux, Win3.11, Win95/96, WinNT/2K/XP/Vista и т.д.) и компилятор (MASM, YASM, FASM и т.д.), а так же, то что ты сам сумел сделать... smile 
вспоминаем арифметику 8*2904+(9*2904)/92=726(32+9/23)
Код
mov ax,726;ax=726
mov bx,ax;bx=726
shl ax,3;ax=726*8   8=2^3
add ax,bx;ax=726*8+726=726*9
mov dx,0; для деления делимое должно быть в регистрах dx:ax
mov cx,23
div cx;после деления в dx остаток, в ax частное
shl bx,5;bx=726*32  32=2^5
add ax,bx;ax=726(32+9/23)
 smile  

Это сообщение отредактировал(а) Mikl_ - 7.9.2010, 04:40
PM MAIL   Вверх
oshilan
Дата 7.9.2010, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.3.2010

Репутация: нет
Всего: 0



Mikl_, спасибо! А за комментарии отдельная благодарность smile
PM MAIL   Вверх
oshilan
Дата 7.9.2010, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.3.2010

Репутация: нет
Всего: 0



Решил решить 2-ой пример 1993/(3*93)-6*93*403 и masm32 выдал такие ошибки:
Код
C:\a.asm(8) : error A2001: immediate operand not allowed
C:\a.asm(15) : error A2001: immediate operand not allowed
C:\a.asm(16) : error A2001: immediate operand not allowed
C:\a.asm(20) : warning A4023: with /coff switch, leading underscore required for start address : start

А вот мой текст программы:
Код
.386
.MODEL flat
.DATA
.CODE
start:

mov ax,93
mul 3
mov ax,bx
mov ax,1993
mov dx,0
div bx
mov bx,ax
mov ax,6
mul 93
mul 403
sub bx,ax

ret
end start

Кто-нибудь знает в чём проблема?
PM MAIL   Вверх
ksili
Дата 7.9.2010, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



компилятор не знает какого размера операнд - байт, слово или двойное слово. Соответственно он не понимает на что умножать - на al, ax или eax. Помещайте операнд в регистр. Или возможно прокатит так:
Код

mul word ptr 403
 


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
oshilan
Дата 7.9.2010, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.3.2010

Репутация: нет
Всего: 0



2 ksili: нет, не прокатывает. Те же ошибки :(

Добавлено через 9 минут и 12 секунд
Новый код:
Код
.386
.MODEL flat
.DATA
.CODE
_start:

mov ax,93
mov bx,3
mul bx
mov bx,ax
mov ax,1993
mov dx,0
div bx
mov bx,ax
mov ax,6
mov cx,93
mul cx
mov cx,403
mul cx
sub bx,ax

ret
end _start

Скомпилировался без ошибок. Только нужно проверить правильность подсчётов smile

Добавлено через 13 минут и 46 секунд
Ответ должен быть с минусом, что-то я его в OllyDbg не нахожу. Может кто помочь, где его искать или правильным текстом программы? smile
PM MAIL   Вверх
Mikl_
Дата 7.9.2010, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



oshilan, 
для 16-разрядной DOS нужно писать .model small у вас все регистры 16-разрядные.model flat это для 32-разрядной Windows  mul 3, mul 93 -- так не умножают, если умножение беззнаковое, тогда, в зависимости от размера, первое множимое должно быть в AL/AX/EAX, второе множимое помещают либо в регистр, либо в ячейку памяти, но это не может быть непосредственно число, произведение также зависит от размера множителей и будет помещено в AX/DX:AX/EDX:EAX. Если умножение со знаком, тогда можно использовать команду imul ax,3 или imul ax,93 -- вместо ax может быть любой другой регистр
1993/(3*93)-6*93*403
Код
mov di,93
imul cx,di,3;cx=di*3=279=117h
mov dx,0
mov ax,1993
div cx;ax=1993/(3*93)=7,1433691756272401433691756272401
mov bx,ax
mov ax,403
mul di;ax=di*403=37479=9267h
mov di,6
mul di;dx:ax=ax*di=6*93*403=224874=36E6Ah dx=3 ax=6E6Ah
mov cx,0;cx:bx - dx:ax
sub bx,ax
sbb cx,dx; результат в cx:bx=7-224874= -224867= FFFC919Dh cx=FFFCh bx=919Dh
 smile 

Это сообщение отредактировал(а) Mikl_ - 7.9.2010, 09:19
PM MAIL   Вверх
oshilan
Дата 7.9.2010, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.3.2010

Репутация: нет
Всего: 0



Mikl_, огромное спасибо, всё работает! +1 бы, но не могу )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.