

Кафедра Вычислительной Техники СПбГУ ИТМО
Лабораторная Работа №4 «Макросы, процедуры и модульное программирование на языке Ассемблер»
Выполнил: Раевский С.С. гр. 2103
- Санкт-Петербург 2011 –
Раевский Сергей Сергеевич, группа 2103 |
1 |

Кафедра Вычислительной Техники СПбГУ ИТМО
Цель работы:
Освоить базовые навыки создания многомодульных программ.
Научится создавать процедуры, вызывать их, передавать им параметры и получать результат.
Изучить возможности MASM по созданию макросов.
Исходный текст программы:
; dosmacro.inc
setds macro ; set data segment mov ax, @data
mov ds, ax
endm
pushAXDX macro push ax push dx
endm
popAXDX macro pop dx pop ax
endm
doscall macro _AX, _DX pushAXDX
mov ax, _AX mov dx, _DX int 21h
popAXDX
endm
printCR macro
doscall 0200h, 13 doscall 0200h, 10
endm
print macro __str ; prints string on screen pushAXDX
mov ah, 09h lea dx, __str int 21h
Раевский Сергей Сергеевич, группа 2103 |
2 |

Кафедра Вычислительной Техники СПбГУ ИТМО
popAXDX
endm
input macro __str ; input string pushAXDX
mov ah, 0ah lea dx, __str sub dx, 2
int 21h
popAXDX
endm |
|
terminate macro errcode |
; ends programm |
mov ah,4ch |
|
mov al, errcode |
|
int 21h |
|
endm |
|
; tohex.asm
.386
code segment use16
include dosmacro.inc ; Macro defenitions
pushwoeax macro ; pushes almost all, lol push ebx
push ecx push edx
push esi push edi push ebp
endm
popwoeax macro ; pops almost all, lol pop ebp
pop edi pop esi
pop edx pop ecx pop ebx
endm
public tohex
Раевский Сергей Сергеевич, группа 2103 |
3 |

Кафедра Вычислительной Техники СПбГУ ИТМО
tohex proc far
pushwoeax ; saving regs
mov bp, sp
add bp, 24 ; skiping all saved by pushad add bp, 4 ; and by call
mov si, [bp] mov di, si
add bp, 2 mov cx, [bp]
; now - in cx we have len and in si we have offset
;
; Part one - conversion str -> int
;
mov dl, [si]
cmp dl, "+" je SkipL
cmp dl, "-" jne ConvI
SkipL:
inc si ; to the next letter dec cx
ConvI:
xor edx, edx xor eax, eax mov EBX, 10
_LoopI:
; character must be in 0..9 mov dl, [si]
sub dl, "0"
cmp dl, 9
jg ConvError
Раевский Сергей Сергеевич, группа 2103 |
4 |

Кафедра Вычислительной Техники СПбГУ ИТМО
add eax, edx mul ebx
inc si
loop _LoopI ; and agein, and agein
div ebx ; lool
mov dl, [di] cmp dl, "-" jne Hex
neg eax
jmp Hex
ConvError:
mov ax, 01h jmp ConvEnd
;
; Part 2 - from int to hex
;
Hex:
mov si, di
add si, 7 ; DWORD format, lol mov cx, 8
_Loop:
mov dl, al
shr eax, 4 ; div 16
shl dl, 4 ; last 4 bits shr dl, 4
cmp dl, 9 jg Let
add dl, "0" jmp Store
Let:
sub dl, 10 add dl, "A"
Store:
mov [si], dl
Раевский Сергей Сергеевич, группа 2103 |
5 |

Кафедра Вычислительной Техники СПбГУ ИТМО
dec si
loop _Loop
ConvEnd:
popwoeax ret
tohex endp
code ends end
; lab4.asm
.model small ; memory model
.stack 256
extrn tohex:far
.data
MaxLen db 7 ;
Len db 0
Bufer db '$$$$$$$$$$'
; messages
HelloMsg db 'Input a number, please: $' ResultMsg db 'Hex number is: $' ErrorMsg db 'Error in input!$'
.code ; code segment
include dosmacro.inc ; Macro defenitions
main:
setds
print HelloMsg input Bufer printCR
xor ax, ax mov al, Len push ax
Раевский Сергей Сергеевич, группа 2103 |
6 |

Кафедра Вычислительной Техники СПбГУ ИТМО
lea dx, Bufer push dx
call tohex
cmp ax, 0 jne _Error
print ResultMsg print Bufer
jmp _End
_Error:
print ErrorMsg
_End:
terminate 0h
end main
Результаты работы программы:
Input a number, please: -12345
Hex number is: FFFFCFC7
Раевский Сергей Сергеевич, группа 2103 |
7 |