Лабораторная работа №53 / 5
.docСанкт-Петербургский Государственный Электротехнический Университет
Кафедра вычислительной техники
Лабораторная работа №5
3-ий семестр, программирование на языке ассемблера
«Поразрядная обработка»
Студент гр. 181x:
Санкт-Петербург
2002
Задание.
Составить программу, вводящую исходное слово и слово-маску. Программа должна обработать указанным в варианте задания способом разряды слова-источника, соответствующих единичным значениям слова-маски. Далее, пользуясь указанной операцией сдвига, подсчитать количество единиц (нулей) в слове-результате.
Вариант |
Вид обработки |
Операция сдвига |
Подсчитать |
2 |
установить |
SAL |
единицы |
Ход выполнения работы.
Написание программы.
Текст программы:
;lab5
cod segment
assume cs:cod,ds:dat
;--- cls, regured: ---
;clear db 27,'[2J$'
;ansi.sys loaded
cls proc
push ax
mov ah,09h
mov dx,offset clear
int 21h
pop ax
ret
cls endp
;--- / ---
;--- input hex numbers, save in BX. and inputing by enter! ---
hexin proc
mov bx,0
inpt: mov ah,08h
int 21h
cmp al,13 ;enter?
je done ;if yes, input space
cmp al,27 ;esc?
je done ;if yes, exit
cmp al,'0' ;<0?
jb inpt ;if yes, input again
cmp al,'9' ;?<=9?
jbe ok ;if yes, digit
cmp al,'F' ;?>F
ja inpt ;if yes, input again
cmp al,'A' ;?<A
jb inpt ;if yes, input again
ok: mov ah,02h ;show-
mov dl,al ;the-
int 21h ;symbol
cmp al,'9' ;digit?
ja letter ;letter!
sub al,'0' ;if digit, convert to code
and ax,0fh ;mask rest of the bits
jmp addd ;go on
letter: sub al,55 ;if letter, convert to code
and ax,0fh ;mask rest of the bits
addd: mov cl,4 ;mul previous result-
sal bx,cl ;on 16 by moving for 4 bits to the left
or bx,ax ;add new number
jmp inpt ;go input again
done: ret
hexin endp
;--- / ---
proc wrd_asc
push ax
and ax,0f000h
mov cl,12
shr ax,cl
call bin_asc
mov byte ptr [si],al
pop ax
push ax
and ax,0f00h
mov cl,8
shr ax,cl
inc si
call bin_asc
mov byte ptr [si],al
pop ax
push ax
and ax,0f0h
mov cl,4
shr ax,cl
inc si
call bin_asc
mov byte ptr [si],al
pop ax
push ax
and ax,0fh
inc si
call bin_asc
mov byte ptr [si],al
pop ax
ret
wrd_asc endp
bin_asc proc
cmp al,9
ja lettr
add al,30h
jmp okk
lettr: add al,37h
okk: ret
bin_asc endp
begin: mov ax,dat
mov ds,ax
call cls
;inputing word
mov ah, 09h
mov dx, offset wor
int 21h
call hexin
cmp al,27 ;esc?
je close
push bx
;inputing mask
mov ah, 09h
mov dx, offset retu
int 21h
mov ah, 09h
mov dx, offset mask
int 21h
call hexin
cmp al,27 ;esc?
je close
;compare word and mask
mov ah, 09h
mov dx, offset retu
int 21h
mov ah, 09h
mov dx, offset resu
int 21h
pop ax ;now mask in BX, word in AX
or ax,bx ;compare, result in AX
push ax
mov si,offset string1
call wrd_asc
mov ah,09h
mov dx, offset string1
int 21h
;counting meaning bits
mov bx,0
mov cx,16
pop ax
move: sal ax,1 ;move highest bit in AX to CF
adc bl,0
loop move
push bx
mov ah, 09h
mov dx, offset retu
int 21h
mov ah, 09h
mov dx, offset counter
int 21h
pop ax
cmp al,9 ;<=9?
jbe dig
push ax
mov ah,02h
mov dl,'1'
int 21h
pop ax
sub al,0ah
dig: add al,'0'
finita: mov ah,02h
mov dl,al
int 21h
close: mov ax, 4c00h
int 21h
cod ends
dat segment
string1 db 4 dup ('?'),'h$'
clear db 27,'[2J$'
wor db 'input word: $'
mask db 'input mask: $'
resu db 'result is: $'
counter db 'meaning bits in result: $'
retu db 13,10,'$'
dat ends
stk segment
db 256 dup(?)
stk ends
end begin
Примечания:
В код программы были введены несколько процедур:
cls – очищает экран дисплея, используя esc-последовательность. Для её правильной работы в системе должен быть установлен ANSI-драйвер.
hexin – процедура ввода шестнадцатеричного кода с клавиатуры. Выводит текст на экран дисплея и сохраняет введённое значение в регистре BX. Ввод заканчивается нажатием Enter, выход из процедуры – нажатием Esc.
wrd_asc – процедура сканирования содержимого регистра AX и помещения ASCII кодов символов в переменную, адресуемую через регистр SI.
bin_asc – процедура используется процедурой wrd_asc. Преобразует четвёрку битов в младшей половине AL в ASCII код, результат помещается в AL.
Программа предлагает ввести слово, сохраняет его в стеке. Затем, предлагает ввести слово-маску, сохраняет её в регистре BX. Возвращает слово из стека в регистр AX и сравнивает их. Устанавливает в единицы все биты слова, соответствующие значимым битам слова-маски. Конвертирует результат в ASCII коды и сохраняет их в строке string1 для последующего вывода на экран. Выводит строку string1 на дисплей. После, с помощью операции сдвига, программа подсчитывает количество значимых битов в результате. В конце программа выводит ASCII код(ы) количества полученных единиц на экран.
Отладка.
Для проверки работоспособности программы выполните следующую последовательность действий:
Для простоты введём таблицу:
word |
word-mask |
result |
meaning bits |
5555 (1010101010101010) |
AAAA (0101010101010101) |
FFFF (1111111111111111) |
16 |
0 (0000000000000000) |
0 (0000000000000000) |
0000 (0000000000000000) |
0 |
FFFF (1111111111111111) |
FFFF (1111111111111111) |
FFFF (1111111111111111) |
16 |
1 (1000000000000000) |
2 (0100000000000000) |
0003 (1100000000000000) |
2 |
Из вышеизложенного следует, что программа выполняет все возложенные на неё требования и более в отладке не нуждается.
Документация на исполняемый файл.
Программа предлагает ввести слово, а затем – слово маску. Вводить нужно шестнадцатеричные значения, ввод заканчивается нажатием клавиши Enter, нажатие на клавишу Esc приводит к выходу из программы.
После введения вышеуказанных переменных программа анализирует их – устанавливает в единицы все биты слова, соответствующие значимым битам слова-маски. Результат этого действия выводится на экран в шестнадцатеричной форме. Затем программа подсчитывает количество значимых битов в результате и выводит полученное значение на экран.