Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форумы Боевого Народа _ Программирование _ Assembler

Автор: Marusya32 15.12.2010, 12:39

Нужно на ассемблер решить пример С=(А+В)/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 17.12.2010, 9:51

Цитата(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 27.1.2011, 13:35

VARP_9l ну вероятно переменная-результат

Автор: orlusha 28.1.2011, 19:56

EdTambov shr вместо деления катит только для беззнаковых целых. Для целых со знаком sar нужен.

Автор: ideatum 29.1.2011, 2:49

Цитата(orlusha @ Пятница, 28 Января 2011, 19:56:34) *
EdTambov shr вместо деления катит только для беззнаковых целых. Для целых со знаком sar нужен.

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

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

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

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

Автор: EdTambov 29.1.2011, 14:03

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


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

В моем ответе add ax, bx для мебели написано?

Автор: mac_alleb 26.6.2012, 4:15

Во первых что за ассемблер? MASM32 или старый TASM ? Судя по коду уклон делается на старый. (В нем, кстати
mov не проходит, но примем что все в порядке). Тогда xor явно лишний. Да, и proc calc near не забыть. Откуда берутся
a и b и vsp ведь параметров в процедурах на ассемблере нет!? Деление совершенно законно, хотя неплохо бы
использовать shr al,1h shr al,1h (c СL возится неохота). На первый взгляд все.

Автор: Spitfire_Mk 19.6.2014, 14:32

Прям кошмар из школы вернулся...

Автор: AlexM1 21.6.2014, 15:23

VSEM PIZDEC!

Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)