

Кафедра Вычислительной Техники СПбГУ ИТМО
Лабораторная Работа №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 |