Кафедра Вычислительной Техники СПбГУ ИТМО

Лабораторная Работа №5 «Процедуры, прерывания, работа с командной

строкой»

Выполнил: Раевский С.С. гр. 2103

- Санкт-Петербург 2011 –

Раевский Сергей Сергеевич, группа 2103

1

Кафедра Вычислительной Техники СПбГУ ИТМО

Цель работы:

Освоить базовые навыки создания многомодульных программ.

Научится создавать процедуры, вызывать их, передавать им параметры и получать результат.

Изучить возможности MASM по созданию макросов.

Исходный текст программы:

; console.asm

.186

.model small, stdcall

.stack 256

include console.inc

.code

; prints null-terminated string to console

PrintS PROC USES ax dx si _Ptr:WORD

mov si, _Ptr mov ah, 02h

_LoopP:

mov dl, [si] cmp dl, 0

je _EndP int 21h inc si

jmp _LoopP

_EndP:

ret

PrintS ENDP

; inputs a null-terminated string

InputS PROC USES ax dx cx si di _BufPtr:WORD

.data

_IBuf db 254,0, 256 DUP(0h)

.code

Раевский Сергей Сергеевич, группа 2103

2

Кафедра Вычислительной Техники СПбГУ ИТМО

mov ah, 0ah lea dx, _IBuf int 21h

xor cx, cx

mov cl, _IBuf[1]

mov si, offset _IBuf[2] mov di, _BufPtr

rep movsb

xor al, al mov [di], al

_EndI:

ret

InputS ENDP

PrintCR PROC

.data

__CR db 13,10,0

.code

invoke PrintS, offset __CR ret

PrintCR ENDP

PrintSCr proc _Ptr:WORD

invoke PrintS, _Ptr call PrintCR

ret

PrintSCr endp

InputSCr PROC _BufPtr:WORD

invoke InputS, _BufPtr call PrintCR

ret

InputSCr ENDP

 

 

Раевский Сергей Сергеевич, группа 2103

3

Кафедра Вычислительной Техники СПбГУ ИТМО

end

; system.asm

.186

.model small, stdcall

.stack 256

include system.inc

.code

Terminate PROC ErrCode:byte

mov ah, 4ch

mov al, ErrCode int 21h

Terminate ENDP

end

; strings.asm

.186

.model small, stdcall

.stack 256

include strings.inc

.code

StrLength proc uses cx si _Ptr:word mov si, _Ptr

xor cx, cx

_LoopL:

lodsb

cmp al, 0 je _EndL inc cx

jmp _LoopL

 

 

Раевский Сергей Сергеевич, группа 2103

4

Кафедра Вычислительной Техники СПбГУ ИТМО

_EndL:

mov ax, cx ret

StrLength endp

; compares null terminated strings

StrCmp PROC USES di si _Ptr1:WORD, _Ptr2:WORD

mov si, _Ptr1 mov di, _Ptr2

_LoopS:

mov al, [si] mov ah, [di] cmp al, ah jne _NotEqual

cmp al, 0 je _Equal

inc si inc di

jmp _LoopS

_NotEqual:

mov ax, 0 jmp _EndS

_Equal:

mov ax, 1

_EndS:

ret

StrCmp ENDP

; unsigned converts

IConv_ PROC USES cx ax bx dx di si Number:WORD, Base:WORD, _BufPtr:WORD

.data

_Buf db "0000000000000000",0 _d2h db "0123456789ABCDEF",0

.code

mov ax, Number

Раевский Сергей Сергеевич, группа 2103

5

Кафедра Вычислительной Техники СПбГУ ИТМО

mov bx, Base

mov di, offset _Buf

xor cx, cx

_LoopIC:

cmp ax, 0 je _Store

xor dx, dx div bx

add dx, offset _d2h mov si, dx

movsb

inc cx

jmp _LoopIC

_Store:

mov si, di dec si

mov di, _BufPtr

_LoopSt:

mov al, [si] mov [di], al

inc di dec si

loop _LoopSt

xor al, al mov [di], al

_EndIC:

ret

IConv_ ENDP

; unsigned converts

Раевский Сергей Сергеевич, группа 2103

6

Кафедра Вычислительной Техники СПбГУ ИТМО

IConv_Z PROC USES cx ax di si Number:WORD, Base:WORD, Zeros:WORD, _BufPtr:WORD

.data

_BufN db "0000000000000000",0

;_BufR db "0000000000000000",0

.code

mov al, '0'

mov di, _BufPtr mov cx, Zeros rep stosb

xor al, al mov [di], al

mov si, offset _BufN mov di, _BufPtr

invoke IConv_, Number, Base, offset _BufN invoke StrLength, offset _BufN

mov cx, Zeros sub cx, ax add di, cx

mov cx, ax rep movsb

ret

IConv_Z ENDP

IConvD PROC Number:WORD, _BufPtr:WORD invoke IConv_, Number, 10, _BufPtr ret

IConvD ENDP

IConvB PROC Number:WORD, _BufPtr:WORD invoke IConv_, Number, 2, _BufPtr ret

IConvB ENDP

IConvH PROC Number:WORD, _BufPtr:WORD

invoke IConv_, Number, 16, _BufPtr

Раевский Сергей Сергеевич, группа 2103

7

Кафедра Вычислительной Техники СПбГУ ИТМО

ret IConvH ENDP

IConvHZ PROC Number:WORD, Zeros:WORD, _BufPtr:WORD invoke IConv_Z, Number, 16, Zeros, _BufPtr ret

IConvHZ ENDP

IConvO PROC Number:WORD, _BufPtr:WORD invoke IConv_, Number, 8, _BufPtr ret

IConvO ENDP

end

; menu.asm

.186

.model small, stdcall

.stack 256

include console.inc include strings.inc include system.inc

include menu.inc

.code

MenuCmd proc uses ax

.data

Regname db "ES=",0

QuitCmd db "quit",0

ErrorMsg db ": not recognized command",0 _Msg db ">",0

_Buf db 256 dup(0) _Num db "0000",0 _0x db "0x",0

.code

_LoopCmd:

invoke PrintS, offset _Msg invoke InputSCr, offset _Buf

 

 

Раевский Сергей Сергеевич, группа 2103

8

Кафедра Вычислительной Техники СПбГУ ИТМО

xor al, al

mov _Buf[4], al ; truncate input

invoke StrCmp, offset _Buf, offset Regname cmp ax, 1

jne _Else1

mov ax, es ;----------------------

invoke IConvHZ, ax, 4, offset _Num

invoke PrintS, offset Regname invoke PrintS, offset _0x invoke PrintSCr, offset _Num

jmp _Finaly

_Else1:

invoke StrCmp, offset _Buf, offset QuitCmd cmp ax, 1

jne _Else2

invoke Terminate, 0

jmp _Finaly

_Else2:

invoke PrintS, offset _Buf invoke PrintSCr, offset ErrorMsg

jmp _Finaly

_Finaly:

jmp _LoopCmd

MenuCmd endp

end

; lab5.asm

.186

.model small, stdcall

.stack 256

 

 

Раевский Сергей Сергеевич, группа 2103

9

Кафедра Вычислительной Техники СПбГУ ИТМО

include console.inc include system.inc include strings.inc include menu.inc

.data

WelcomeMsg db "MIU MIU LAb #5 ^_^",0

.code

main proc

mov ax, @data mov ds, ax mov es, ax

invoke PrintSCr, offset WelcomeMsg ; say hello to user invoke MenuCmd

_End:

invoke Terminate, 0

main endp

end

Результаты работы программы:

>nfdjsfnsj

nfdj: not recognized command >ES=

ES=058A

>quit

Раевский Сергей Сергеевич, группа 2103

10

Соседние файлы в папке лабораторные работы (отчеты) по ассемблеру