Assembler, Проверьте код |
|
Здравствуйте, гость ( Вход | Регистрация )
Assembler, Проверьте код |
15.12.2010, 12:39
Сообщение
#1
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
Нужно на ассемблер решить пример С=(А+В)/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 ] |
|
|
17.12.2010, 9:51
Сообщение
#2
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
Нужно на ассемблер решить пример С=(А+В)/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 асм Но если мне не изменяет память, то выделенная операция делит 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% идеал, но правильнее предыдущего Изменения выделил. Есть вариант вообще без операции деления, потому как идет деление на 4 (2 в степени 2) Вместо mov bl, 4h div bl можно вставить shr ax, 2 Это побитовый сдвиг регистра ax на 2 бита вправо, что равносильно делению без остатка на 4 |
|
|
27.1.2011, 13:35
Сообщение
#3
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
VARP_9l ну вероятно переменная-результат
|
|
|
28.1.2011, 19:56
Сообщение
#4
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
EdTambov shr вместо деления катит только для беззнаковых целых. Для целых со знаком sar нужен.
|
|
|
29.1.2011, 2:49
Сообщение
#5
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
EdTambov shr вместо деления катит только для беззнаковых целых. Для целых со знаком sar нужен. Орлуша, там старший байт всегда 0, т.е. всегда без знака, так что в данном случае пофиг, но насчет знака замечание верное (см. ниже) Там более страшная проблема, возможно переполнение если вы складываете два байта, результат может быть больше 255 и потому необходимо проверить флаг переноса, если я не ошибаюсь CF, либо использовать комманду ADC (Add with carry) Опять же правильное замечание Орлушы, насчет знака. A и В это числа со знаком или нет? Для корректного решения необходимо более корректно поставить условие задачи, определите область значений A и В, а также как интерпретируются их значения (знаковые/беззнаковые). После этого данную задачу можно будет решить... |
|
|
29.1.2011, 14:03
Сообщение
#6
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
Это же не ядерный реактор программируют
Задача из школы/универа - решения простейшие, без извратов (обычно). Там более страшная проблема, возможно переполнение если вы складываете два байта, результат может быть больше 255 и потому необходимо проверить флаг переноса, если я не ошибаюсь CF, либо использовать комманду ADC (Add with carry) В моем ответе add ax, bx для мебели написано? |
|
|
26.6.2012, 4:15
Сообщение
#7
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
Во первых что за ассемблер? MASM32 или старый TASM ? Судя по коду уклон делается на старый. (В нем, кстати
mov не проходит, но примем что все в порядке). Тогда xor явно лишний. Да, и proc calc near не забыть. Откуда берутся a и b и vsp ведь параметров в процедурах на ассемблере нет!? Деление совершенно законно, хотя неплохо бы использовать shr al,1h shr al,1h (c СL возится неохота). На первый взгляд все. |
|
|
19.6.2014, 14:32
Сообщение
#8
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
Прям кошмар из школы вернулся...
|
|
|
21.6.2014, 15:23
Сообщение
#9
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
VSEM PIZDEC!
|
|
|
Текстовая версия | Сейчас: 27.9.2024, 7:07 |