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