ПРОГРАММИРОВАНИЕ Помогите найти ошибку в коде на ассемблере и объясните как должно выглядить правильно и почему

  • lolopups
  • Автор темы
  • Халявщик
  • 0
Правильный ли код, как я понял, программа должна вывести из 0 отрицательное, кто то сказал, что нужно применить команду test, а я считаю его применять не надо, как после команды not сделать так, чтобы результат вывелся?
 
  • BetDev
  • Автор темы
  • Халявщик
  • 0
Код может не работать из-за нескольких причин. Рассмотрим возможные ошибки и предложим решения:

  1. Неправильное использование условных переходов:
    • Код использует команды test cx, bx, jne label2, и je label1. Однако test выполняет побитовую операцию "И" между cx и bx, а не сравнивает их напрямую. Это может привести к неожиданным результатам, так как test проверяет, есть ли хотя бы один общий установленный бит. В данном случае, для сравнения регистров лучше использовать команду cmp cx, bx, а не test.
    • Исправление: Замените строку test cx, bx на cmp cx, bx.
  2. Ошибка в начале программы:
    • В начале кода mov cx, 0, после чего выполняется not cx, что приведет к значению 0xFFFF в cx. Затем bx устанавливается в 1. Следовательно, после выполнения cmp cx, bx, сравнение даст "не равно", и переход пойдет в label2.
  3. Сообщения с $ как признак конца строки:
    • В коде для строк String db 'одно из чисел равно 0$' и string1 db 'не равны 0$' используется символ $ как завершитель строки для int 21h, которая выводит строку. Это в целом правильно, но убедитесь, что компилятор интерпретирует $ как конец строки для DOS.
  4. Регистр AH:
    • Перед выводом строки устанавливается mov ah, 9, что правильно. Эта команда указывает DOS на вывод строки, оканчивающейся на $. Если это не срабатывает, возможно, среда выполнения не поддерживает DOS-интеррапты.
  5. Отсутствие завершения программы:
    • В конце программы после меток label1 и label2 есть команда ret, но это не завершает программу корректно. Лучше добавить int 20h или mov ah, 4Ch и int 21h для правильного завершения программы в DOS.
.model tiny .code org 100h begin: mov cx, 0 not cx mov bx, 1 cmp cx, bx ; Сравниваем CX с BX jne label2 ; Переход если CX не равен BX je label1 ; Переход если CX равен BX label1: mov ah, 9 mov dx, offset string int 21h jmp end_program ; Переход в конец программы label2: mov ah, 9 mov dx, offset string1 int 21h end_program: mov ah, 4Ch ; Завершение программы int 21h String db 'одно из чисел равно 0$' string1 db 'не равны 0$' end begin
 
  • svyanov
  • Автор темы
  • Халявщик
  • 0
.model tiny
.code
org 100h

begin:
mov cx, 0
not cx
mov bx, 1
test cx, bx
jne label2
jmp label1

label1:
mov ah, 9
mov dx, offset string
int 21h
ret

label2:
mov ah, 9
mov dx, offset string1
int 21h
ret

string db "odno iz chisel ravno 0$"
string1 db "ne ravno 0$"
end begin

Попробуй
 
Войдите или зарегистрируйтесь для ответа.
ПОДПИШИСЬ НА КАНАЛ, ЧТО БЫ НЕ ПРОПУСТИТЬ ИНТЕРЕСНЫЙ СЛИВСКЛАДЧИНА ДЖОНСА-ЛУЧШЕЕ МЕСТО ДЛЯ ВЫКУПА ДОРОГИХ КУРСОВ, СХЕМ ЗА КОПЕЙКИ
Warning!
Если вы собираетесь написать отзыв, прикрепите доказательства своих слов: скриншоты переписки, квитанции о переводах, фотографии выполненных работ. В противном случае ваш отзыв будет удален. Делайте свои отзывы правильно.

Просматревшие тему

Сверху