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

Лабораторная Работа №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

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