Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
01.05.2014
Размер:
62.46 Кб
Скачать

Санкт-Петербургский Государственный Электротехнический Университет

Кафедра вычислительной техники

Лабораторная работа №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 приводит к выходу из программы.

После введения вышеуказанных переменных программа анализирует их – устанавливает в единицы все биты слова, соответствующие значимым битам слова-маски. Результат этого действия выводится на экран в шестнадцатеричной форме. Затем программа подсчитывает количество значимых битов в результате и выводит полученное значение на экран.

Соседние файлы в папке Лабораторная работа №53
  • #
    01.05.201462.46 Кб85.doc
  • #
    01.05.20144.41 Кб6LAB5.ASM
  • #
    01.05.2014185 б6labz3-124.exe.log