Проверка на знак числа (and, test) - Assembler

Узнай цену своей работы

Формулировка задачи:

and  bx,    8000h
js znakect
jns znakanet
 
znakect:
    mov   ah,09h  
    mov dx, offset int3
    int 21h
    jmp @end2
    
znakanet:
    mov   ah,09h  
    mov dx, offset int4
    int 21h
    jmp @end2
всегда выводит, что знака нет почему так? а если брать jz и jnz, то всегда знак есть

Решение задачи: «Проверка на знак числа (and, test)»

textual
Листинг программы
; проверка на четность
;test dx, dx;
and  dx,    0001h
jz chetnoe
jnz nechetnoe
 
chetnoe:
    mov   ah,09h                 ; испортил AH
    mov dx, offset int2
    int 21h                         ; испортил AL (эта функция AL портит, записывая в него 24h)
    jmp @znak
    
nechetnoe:
    mov   ah,09h                  ; испортил AH
    mov dx, offset int1
    int 21h                         ; испортил AL (эта функция AL портит, записывая в него 24h)
    jmp @znak
 
@znak:
mov bx, ax                        ;здесь уже в ax мусор (тонее 924h), причем 9 в AH запихал ты
; проверка на знак
;test bx, bx;
and  bx,    8000h                ;проверяем на знак мусор 924h (к слову он всегда положительный)

Объяснение кода листинга программы

  1. Проверка на четность:
    • test dx, dx - проверяет, является ли значение в регистре dx четным. Если это так, то переходит к метке chetnoe, иначе переходит к метке nechetnoe.
    • and dx, 0001h - проверяет последний бит регистра dx. Если он равен 1, то число нечетное, и переходит к метке nechetnoe, иначе переходит к метке chetnoe.
    • jz chetnoe - если значение в регистре dx четное, то переходит к метке chetnoe.
    • jnz nechetnoe - если значение в регистре dx нечетное, то переходит к метке nechetnoe.
    • mov ah,09h - перед использованием функции int 21h испортить AH, чтобы в нем было значение 9.
    • mov dx, offset int2 - перед использованием функции int 21h записать в регистр dx адрес таблицы функций, чтобы функция обработала число как целое.
    • int 21h - вызывает функцию обработки числа, которая записывает в AL значение 24h, независимо от того, какое число было в регистре dx.
    • jmp @znak - после использования функции int 21h переходит к метке @znak.
  2. Проверка на знак:
    • test bx, bx - проверяет, является ли значение в регистре bx равным 0. Если это так, то переходит к метке znak, иначе переходит к метке neznak.
    • and bx, 8000h - проверяет последний бит регистра bx. Если он равен 1, то число отрицательное, и переходит к метке neznak, иначе переходит к метке znak.
    • mov bx, ax - перед проверкой значения в регистре bx, скопировать значение из регистра ax в bx. В ax уже мусор (924h), причем 9 записано в AH.
    • jz znak - если значение в регистре bx равно 0, то переходит к метке znak.
    • jnz neznak - если значение в регистре bx не равно 0, то переходит к метке neznak.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы