Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Assembler
Форумы Боевого Народа > Высокие технологии во всех вариациях > Софт > Программирование
Marusya32
Нужно на ассемблер решить пример С=(А+В)/4-16, есть код, проверьте его на правильность, пожалуйста:
[ calc proc
xor al, al
mov al, a
mov bl, b
add al, bl
mov bl, 4h
div bl
sub al, 10h
mov vsp, al
ret
calc endp
]
EdTambov
Цитата(Marusya32 @ Среда, 15 Декабря 2010, 12:39:20) *
Нужно на ассемблер решить пример С=(А+В)/4-16, есть код, проверьте его на правильность, пожалуйста:
[ calc proc

xor al, al
mov al, a
mov bl, b
add al, bl
mov bl, 4h
div bl
sub al, 10h
mov vsp, al
ret

calc endp
]


че-то я уже совсем подзабыл 16-битный x86 асм smile.gif
Но если мне не изменяет память, то выделенная операция делит AX на BL.
Это автоматически означает, что первая часть кода не очень корректная.

То есть, финальный вариант
Цитата
calc proc

xor ax, ax
xor bx, bx
mov al, a
mov bl, b
add ax, bx
mov bl, 4h
div bl
sub al, 10h
mov vsp, al
ret

calc endp

Может быть, не на 100% идеал, но правильнее предыдущего yes.gif
Изменения выделил.

Есть вариант вообще без операции деления, потому как идет деление на 4 (2 в степени 2)
Вместо

mov bl, 4h
div bl

можно вставить

shr ax, 2

Это побитовый сдвиг регистра ax на 2 бита вправо, что равносильно делению без остатка на 4
EdTambov
VARP_9l ну вероятно переменная-результат
orlusha
EdTambov shr вместо деления катит только для беззнаковых целых. Для целых со знаком sar нужен.
ideatum
Цитата(orlusha @ Пятница, 28 Января 2011, 19:56:34) *
EdTambov shr вместо деления катит только для беззнаковых целых. Для целых со знаком sar нужен.

Орлуша, там старший байт всегда 0, т.е. всегда без знака, так что в данном случае пофиг, но насчет знака замечание верное (см. ниже)

Там более страшная проблема, возможно переполнение если вы складываете два байта, результат может быть больше 255 и потому необходимо проверить флаг переноса, если я не ошибаюсь CF, либо использовать комманду ADC (Add with carry)

Опять же правильное замечание Орлушы, насчет знака. A и В это числа со знаком или нет?

Для корректного решения необходимо более корректно поставить условие задачи, определите область значений A и В, а также как интерпретируются их значения (знаковые/беззнаковые). После этого данную задачу можно будет решить...
EdTambov
Это же не ядерный реактор программируют smile.gif
Задача из школы/универа - решения простейшие, без извратов (обычно).


Цитата(ideatum @ Суббота, 29 Января 2011, 02:49:41) *
Там более страшная проблема, возможно переполнение если вы складываете два байта, результат может быть больше 255 и потому необходимо проверить флаг переноса, если я не ошибаюсь CF, либо использовать комманду ADC (Add with carry)

В моем ответе add ax, bx для мебели написано?
mac_alleb
Во первых что за ассемблер? MASM32 или старый TASM ? Судя по коду уклон делается на старый. (В нем, кстати
mov не проходит, но примем что все в порядке). Тогда xor явно лишний. Да, и proc calc near не забыть. Откуда берутся
a и b и vsp ведь параметров в процедурах на ассемблере нет!? Деление совершенно законно, хотя неплохо бы
использовать shr al,1h shr al,1h (c СL возится неохота). На первый взгляд все.
Spitfire_Mk
Прям кошмар из школы вернулся...
AlexM1
VSEM PIZDEC!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.