Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычислить арифметическое выражение, Исправьте код пожалуйста 
:(
    Опции темы
hack7
Дата 24.8.2017, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! Проверьте что не так надо вычислить выражение f = (a-b)*c/2+d, если a, b, c, d - байтовые, a=15, b = 70, c=25, d=35 Надо еще вывести результат в виде двоичном и шестнадцатеричном значении. 

.model small
.stack 256
.data
a db 15
b db 70
c db 25
d db 35
f dw 0
.code
main:
xor ax, ax
mov al, 15
cbw
movsx bx, ax
sub ax, bx
imul c
idiv 2
xor dx, dx
mov dl, d
movsx ax, dx
add ax, dx
exit:
mov ax, 4c00h
int 21h
end main
PM MAIL   Вверх
JAPH
Дата 27.8.2017, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проследите внимательно за тем, как исполняются команды.

Код
        .model  small
        .stack  256
        .data
a       db      15
b       db      70
c       db      25
d       db      35
f       dw      0
        .code
main:   xor     ax, ax     ; Лишняя команда, т.к. дальше все равно AX перезаписывается
        mov     al, 15     ; Следите за тем, что получается. Вот сейчас AL = 15. Наверное, нужно было не хардкодить константу, а прочитать ячейку а
        cbw                ; Теперь AX = 15
        movsx   bx, ax     ; Знаковое расширение 16-битного AX до 16-битного же BX? Такой команды нет, просто MOV тогда. Ну да ладно, BX = 15
        sub     ax, bx     ; AX := AX - BX, т.е. теперь AX = 0. Вы же хотели a-b, т.е. в BX должно было быть b, а не AX? Предыдущая команда неверна
        imul    c          ; Умножает AL на c и помещает результат в AX. Зачем было раньше работать с 16-битными числами, если здесь AH игнорируется?
        idiv    2          ; Такой команды тоже нет. IDIV принимает либо регистр, либо ячейку памяти в качестве операнда.
        xor     dx, dx     ; DX = 0
        mov     dl, d      ; DL = d, но DX это не знаковое расширение DL сейчас. Можно было сделать MOVSX DX, d
        movsx   ax, dx     ; AX = d с поправкой на то, что должно быть просто MOV
        add     ax, dx     ; AX := AX + DX, т.е. AX = 2d. Та же ошибка, что и с вычитанием
exit:   mov     ax, 4C00h
        int     21h
        end     main


Вычитание a-b делайте 8-битным. Далее умножение дает 16-битное число. Деление надо тоже сделать 16-битным, т.к. результат, скорее всего, не поместится в 8 бит. Поэтому надо делитель 2 занести либо в регистр, либо в ячейку памяти, и использовать idiv с 16-битным операндом, которая делит на него 32-битное число в регистровой паре DX:AX, которое нужно получить из AX командой cwd. Зачем нужна f, я не понял. По поводу вывода чисел смотрите статью http://forum.vingrad.ru/faq/topic-158522/k...0%BB%D0%B0.html

Это сообщение отредактировал(а) JAPH - 27.8.2017, 20:43


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

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

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


 




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


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

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