Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 175

Unknown Author

Вывод целого без знака размером в слово обращение:    outword num [,leng]

num и leng - как в outint

outword macro num, leng

outnum <num>,<leng>,0 endm

Вспомогательный макрос проверки написания имени разными (большими и малыми) буквами

same macro name,variants,ans ans=0

irp v,<variants>

ifidn <name>,<v>

ans=l

exitm

endif

endm

endm

Вспомогательный макрос для outint (sign-1) и outvord (=0)

outnum macro num, leng,sign local regdx? push ax push dx

same <num>,<dx,DX,Dx,dX>,regdx? if regdx?    ;;out dx,leng —>

ifb <leng>    ;;    mov al,leng

mov al,0    ;;    xchg ax,dx

else

mov al,leng endif

xchg ax,dx

else    ;;out num,leng (numodx) —>

ifb <leng>    ;;    mov dl,leng

mov dl,0    ;;    mov ax,num

else

mov dl,leng endif

mov ax,num endif

mov dh,sign

call procoutnum    ;;ax=num, dl-leng, dh-sign

pop dx pop ax endm

*********************************************************** ВВОД С КЛАВИАТУРЫ

***********************************************************

Очистка буфера ввода с клавиатуры обращение: flush

extrn procflush:far flush macro

call procflush endm

Enter)

Ввод символа (с пропуском кондов строк, т обращение: inch х

где х - r8, т8

на выходе: х - введенный символ

extrn procinch:far inch macro x

local regax?

same <x>,<ah,AH,Ah,aH>,re,gax? if regax?

xchg ah,al    ;;x=ah

mov al,0

call procinch

xchg ah,al

else

same <x>,<al,AL,Al,aL>,regax? if regax?

mov al,0    ;;x=al

call procinch

else

push ax    ; ;x - не    ah и не al

mov al,0

call procinch

mov x,al

pop ax

endif

endif

endm

Ввод целого числа (со знаком и без) размером в слово обращение: inint х

где х - rl6, ml6 иа выходе: х - введенное число особенности ввода:

пропускаются все пробелы и концы строк перед числом; число должно начинаться с цифры, перед ней возможен знак; при минусе число вводится как отрицательное;

ввод идет до первой нецифры (в т.ч. до Enter), она глотается; при ошибке будет печать сообщения и останов программы; ошибки: "нет цифры" - в числе нет ни одной цифры "переполнение" - большое по модулю число (вне отрезка [-32768,+65535])

extrn procinint:far inint macro x

local regax?

same <x>,<ax,AX,Ax,aX>,regax? if regax?

call procinint    ;;x=ax

else

push ax    ;;x<>ax

call procinint

mov x,ax

pop ax

endif

endm

; восстановить запись в листинг: .list

дополнительные возможности

В этой главе рассматриваются те команды ПК и средства ЯА, которые относительно редко используются на практике и которые не были рассмотрены в предыдущих главах книги.

14.1* Двоично-десятичные числа

В гл. 1 уже отмечалось, что в ПК помимо целых чисел, представленных в двоичной системе счисления (двоичных чисел), используются и двоично-десятичные числа (binary coded decimal, BCD). В этом разделе рассматриваются команды ПК, предназначенные для реализации арифметических операций над такими числами.

14.1.1. Представление двоично-десятичных и ASCII-чисел

Напомним, что машинное представление двоично-десятичных чисел строится по следующему правилу: каждая цифра из десятичной записи (неотрицательного) целого числа заменяется на четверку битов, изображающих эту цифру в двоичной системе счисления. Соответствие между десятичными цифрами и четверками битов следующее: