Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2010, 18:25   #1
fuzo
Пользователь
 
Регистрация: 16.09.2010
Сообщений: 40
По умолчанию [РЕШЕНО][Assembler] Правильно ли решено уравнение?

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

Код:
; Составить программу для вычисления выражения: x = y/z + u * v- w

; данные занимают слово (целые со знаком) 

; =======================================

.Model Small     ;определение модели памяти

.Stack 100h        ;начало сегмента стека

.Data                   ;начало сегмента данных

    x   dw ?                             ;определение данных

    y    dw 10

    z    dw 2

    u   dw 4

    w  dw 8

    v   dw 3

.Code                 ;начало сегмента кода

begin: 

mov ax,@Data      ;загрузка в регистр ds адреса сегмента данных

mov ds,ax
mov ax,y
cwd               ;подготовка к делению
idiv z            ;y/z

mov bx,ds         ;hranit yz
mov es,bx


mov ds,ax
mov ax,u
imul v             ;u*v


mov bx,ds
add ax,bx           ;y/z + u * v
sub ax,w            ;y/z + u * v- w



mov x,ax             ;запись результата в x

mov ah,4ch           ;выход из программы

int 21h

end begin
fuzo вне форума Ответить с цитированием
Старый 28.12.2010, 19:07   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Подскажите правильно ли я всё записал?
Компилится? Значит записали правильно.
p51x вне форума Ответить с цитированием
Старый 29.12.2010, 04:12   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

fuzo
Если совпадает с тем, что ты насчитал на калькуляторе -- значит правильно
но правильнее было бы так
Код:
.data 
x dd ?;увеличим размер Х до двойного слова
.code
mov ax,@Data      ;загрузка в регистр ds адреса сегмента данных
mov ds,ax
;не нужно использовать не по назначению сегментные регистры DS и ES они не для этого предназначены
mov ax,y
cwd               ;подготовка к делению
idiv z            ;ax=y/z dx=остаток
mov bx,ax ; сохраняем содержимое АХ в ВХ так как для последующего умножения потребуется АХ
mov ax,u
imul v             ;dx:ax=u*v
add ax,bx           ;dx:ax=y/z + u * v
adc dx,0 ; если при сложении возникнет перенос увеличим dx
sub ax,w            ;dx:ax=y/z + u * v- w
sbb dx,0 ; если при вычитании возникнет займ
mov word ptr x,ax   ;записать младшую часть результата в x из ах
mov word ptr x+2,dx;записать старшую часть результата в x из dх
с учетом этих добавлений содержимое y, z, u, w, v может быть от -32768 до 32767

Последний раз редактировалось Mikl___; 29.12.2010 в 04:39.
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[РЕШЕНО] Delphi 7, if then и else DarkMorfius Помощь студентам 3 05.11.2017 16:07
[РЕШЕНО] как правильно прописать Тег <button> в документе html, чтобы при нажатии на кнопку вызывался другой документ DimaDR HTML и CSS 2 20.10.2017 19:39
[РЕШЕНО] задания на C/C++ noob1997 Фриланс 7 02.08.2017 19:53