Нижегородский Государственный Технический Университет

им.

Лабораторная работа№1

по дисциплине «Системное программное обеспечение»

Тема: Программная модель процессора и программирование в кодах

Выполнил:

студент 10-В-1

Проверил:

               

       

Нижний Новгород

2012 г.

Цель работы

       Разработка многомодульных приложений с использованием ассемблера и языков высокого уровня, изучение соглашений вызова. Разработка консольных и графических приложений для Windows на ассемблере, что способствует пониманию принципов и алгоритмов работы ОС Windows и формирует ряд полезных навыков, необходимых для отладки Windows приложений.

Описание разработанных программ:

cons. exe

Одномодульная программа с моделью памяти flat. Вызывает внешние функции (GetStdHandle, WriteConsoleA, ExitProcess).

Вызывает консоль и выводит в неё текст сообщения.

m_box. exe

Одномодульная программа с моделью памяти flat. Вызывает внешние функции(MessageBoxA, ExitProcess)

Вызывает окно типа Message Box с кнопками Yes/No

S2_L1L. EXE

Двухмодульная программа с моделью памяти large. s2_l1.c содержит вызов процедур. lab1L. asm содержит описание процедур.

Глобальные переменные: _minim.

Процедуры: ASMMIN – сравнивает два числа и возвращает минимальное. Вызывается по соглашению pascal, имеет два параметра  int/byte        

_asmbs – возвращает сумму полученного массива. Вызывается по соглашению C, имеет два параметра int arr[]/adr:word и int count/len:word

НЕ нашли? Не то? Что вы ищете?

В данной модели памяти все внешние функции и процедуры являются дальними(far).

S2_L1.EXE

Двухмодульная программа с моделью памяти small. s2_l1.c содержит вызов процедур. lab1s. asm содержит описание процедур.

Глобальные переменные: _minim.

Процедуры: ASMMIN – сравнивает два числа и возвращает минимальное. Вызывается по соглашению pascal, имеет два параметра  int/byte        

_asmbs – возвращает сумму полученного массива. Вызывается по соглашению C, имеет два параметра int arr[]/adr:word и int count/len:word

В данной модели памяти все внешние функции и процедуры являются ближними(near).

Листинги и карты памяти.

cons. asm

.586

.MODEL FLAT, STDCALL

STD_OUTPUT_HANDLE equ -11

EXTERN GetStdHandle:NEAR

EXTERN WriteConsoleA:NEAR

EXTERN ExitProcess:NEAR

includelib import32.lib

_DATA SEGMENT

str1 DB 10,13,"I want to sleep!",0

lens DD? ;кол. введенных символов

res DD 0

HandleOut DD?

_DATA ENDS

_TEXT SEGMENT

START:

;получить дескриптор стандартного потока вывода

       push STD_OUTPUT_HANDLE

       call GetStdHandle

       mov HandleOut, eax

;длина строки

       push offset str1

       call LENSTR

;вывести строку

       push offset res

       push offset lens

       push ebx  ;длина строки

       push offset str1 ;адрес строки

       push eax  ;HANDLE вывода

       call WriteConsoleA

       push HandleOut  ;HANDLE вывода

       push 0

       call ExitProcess

LENSTR PROC

       push ebp

       mov ebp, esp

       push eax

       push edi

       cld

       mov edi, dword ptr [ebp+08h]

       mov ebx, edi

       mov ecx,100

       xor al, al

       repne scasb ;найти символ 0

       sub edi, ebx ;длина строки, включая 0

       mov ebx, edi

       dec ebx

       pop edi

       pop eax

       pop ebp

       ret 4

LENSTR ENDP

_TEXT ENDS

END START

m_box. asm

includelib import32.lib

extrn MessageBoxA:near

extrn ExitProcess:near

.386

.model flat

.const

hello_title db "TIME: over midnight ",0

hello_message db "Can I go to sleep? Please!",0

MB_ICONINFORMATION equ 40h

MB_YESNO equ 4H

MB_ICONSTOP EQU MB_ICONHAND

IDNO equ 07h

.code

_start:

       push MB_YESNO OR MB_ICONINFORMATION

       push offset hello_title

       push offset hello_message

       push 0

       call MessageBoxA

       cmp eax, IDNO

       je _start

       push 0

       call ExitProcess

end _start

s2_l1.c

#include <stdio. h>

#include <conio. h>

#include <stdlib. h>

extern  pascal int ASMMIN(int, int);        //soglashenie C

extern  cdecl int asmbs(int arr[],int count);        //Soglashenie pascal

int minim;

main()

{

int mas[4]={5,3,7,1};

int len=4,sum;

int a=0,b=0,minloc=0;        

clrscr();

printf("\n Vvedite 2 chisla: \n");

printf("\t a=");

scanf("%d",&a);

printf("\t b=");

scanf("%d",&b);

minloc=ASMMIN(a, b);                

printf("minimalglobal= %d = minimallocal=%d",minim, minloc);

getch();

clrscr();

sum=asmbs(mas, len);                

printf("summas=%d",sum);

getch();

return(0);

}

lab1l. asm

.model small

stack 100h

extrn _printf:near

extrn _minim:word

PUBLIC ASMMIN        

PUBLIC _asmbs

.data

mes1 db 10,13,"b<a",10,13,0

mes2 db 10,13,"a<b",10,13,0

.code

ASMMIN proc near        

       push bp

       mov bp, sp

       mov ax,[bp+4]        ;заносим в ax переменную  b

  cmp ax,[bp+6]        ; сравниваем b? a

       jl saveB        ; b<a

saveA:         ;b>a

       lea ax, mes2

       push ax                ; передача адреса сообщения через стек в ф-ию _printf

       call _printf

       pop ax

       mov ax,[bp+6]

       mov _minim, ax

       jmp exet

saveB:         ;b<a

       mov _minim, ax

       push ax

       lea ax, mes1

       push ax                

       call _printf

       pop ax

       pop ax

exet:

       pop bp

       ret

ASMMIN endp

_asmbs proc C near adr:word, len:word

mov ax,0

mov cx, len

mov si, adr

cycl: add ax,[si]

add si,2

loop cycl

ret

_asmbs endp

end

s2_l1.map

Start  Stop  Length Name  Class

00000H 00BE0H 00BE1H _TEXT  CODE

00BF0H 00BF0H 00000H _FARDATA  FAR_DATA

00BF0H 00BF0H 00000H _FARBSS  FAR_BSS

00BF0H 00BF0H 00000H _OVERLAY_  OVRINFO

00BF0H 00BF0H 00000H _1STUB_  STUBSEG

00BF0H 00E73H 00284H _DATA  DATA

00E74H 00E74H 00000H _CVTSEG  DATA

00E74H 00E74H 00000H _SCNSEG  DATA

00E74H 00E74H 00000H _CONST  CONST

00E74H 00E79H 00006H _INIT_  INITDATA

00E7AH 00E7AH 00000H _INITEND_  INITDATA

00E7AH 00E7AH 00000H _EXIT_  EXITDATA

00E7AH 00E7AH 00000H _EXITEND_  EXITDATA

00E7AH 00EB9H 00040H _BSS  BSS

00EBAH 00EBAH 00000H _BSSEND  BSSEND

00EC0H 00F3FH 00080H _STACK  STACK

Error: Undefined symbol __ABORT in module C0.ASM

Error: Undefined symbol __EXCEPTINIT in module C0.ASM

Error: Undefined symbol _MAIN in module C0.ASM

Program entry point at 0000:0000

s2_L1L. c

#include <stdio. h>

#include <conio. h>

#include <stdlib. h>

extern  pascal int ASMMIN(int, int);        //soglashenie C

extern  cdecl int asmbs(int arr[],int count);        //Soglashenie pascal

int minim;

main()

{

int mas[4]={5,3,7,1};

int len=4,sum;

int a=0,b=0,minloc=0;        

clrscr();

printf("\n Vvedite 2 chisla: \n");

printf("\t a=");

scanf("%d",&a);

printf("\t b=");

scanf("%d",&b);

minloc=ASMMIN(a, b);                

printf("minimalglobal= %d = minimallocal=%d",minim, minloc);

getch();

clrscr();

sum=asmbs(mas, len);                

printf("summas=%d",sum);

getch();

return(0);

}

lab1l. asm

.model large

stack 100h

extrn _printf:far

extrn _minim:word

extrn _raz:word

PUBLIC ASMMIN        

PUBLIC _asmbs

.data

mes1 db 10,13,"b<a",10,13,0

mes2 db 10,13,"a<b",10,13,0

.code

ASMMIN proc far        

       push bp

       mov bp, sp

       mov ax,[bp+6]        ;заносим в ax переменную  b

  cmp ax,[bp+8]        ; сравниваем b? a

       jl saveB        ; b<a

saveA:         ;b>a

       lea ax, mes2

       push ax                ; передача адреса сообщения через стек в ф-ию _printf

       call _printf

       pop ax

       mov ax,[bp+8]

       mov _minim, ax        ;ax=a

       jmp exet

saveB:         ;b<a

       mov _minim, ax

       push ax

       lea ax, mes1

       push ax                

       call _printf

       pop ax

       pop ax

exet:

       pop bp

       ret

ASMMIN endp

_asmbs proc C far adr:word, len:word

mov ax,0

mov cx, len

mov si, adr

cycl: add ax,[si]

add si,2

loop cycl

ret

_asmbs endp

end

s2_l1L. map

Start  Stop  Length Name  Class

00000H 02777H 02778H _TEXT  CODE

02778H 027BBH 00044H lab1l_TEXT  CODE

027C0H 027C0H 00000H _FARDATA  FAR_DATA

027C0H 027C0H 00000H _FARBSS  FAR_BSS

027C0H 027C0H 00000H _OVERLAY_  OVRINFO

027C0H 027C0H 00000H _1STUB_  STUBSEG

027C0H 02CE9H 0052AH _DATA  DATA

02CEAH 02CEBH 00002H _CVTSEG  DATA

02CECH 02CF1H 00006H _SCNSEG  DATA

02CF2H 02CF2H 00000H _CONST  CONST

02CF2H 02CFDH 0000CH _INIT_  INITDATA

02CFEH 02CFEH 00000H _INITEND_  INITDATA

02CFEH 02CFEH 00000H _EXIT_  EXITDATA

02CFEH 02CFEH 00000H _EXITEND_  EXITDATA

02CFEH 02D43H 00046H _BSS  BSS

02D44H 02D44H 00000H _BSSEND  BSSEND

02D50H 02DCFH 00080H _STACK  STACK

02DD0H 02ECFH 00100H STACK  STACK

  Address  Publics by Name

0277:0008  ASMMIN

027C:0000  DATASEG@

0000:028F  DGROUP@

0000:0516  N_SCOPY@

0277:0037  _asmbs

0000:032F  _atexit

0000:11FE  _brk

0000:121A  _clrscr

0000:1376  _cprintf

027C:04E1  _directvideo

0000:1CF8  _eof

027C:0094  _errno

0000:03BC  _exit

0000:1D6F  _fflush

0000:2035  _fgetc

0000:20E0  _fgetchar

0000:1DEC  _flushall

0000:2136  _fputc

0000:225D  _fputchar

0000:16F7  _free

0000:1E81  _fseek

0000:1EE5  _ftell

0000:154C  _getch

0000:1565  _getche

0000:15A0  _gettext

0000:0442  _isatty

0000:1648  _kbhit

0000:04ED  _lseek

0000:0293  _main

0000:17C6  _malloc

0000:20E9  _memcpy

027C:053E  _minim

0000:165A  _movetext

0000:2108  _printf

0000:196E  _putch

0000:15F4  _puttext

0000:191D  _realloc

0000:120A  _sbrk

0000:24CB  _scanf

0000:24E9  _setvbuf

0000:25B5  _strlen

0000:25CF  _ungetc

0000:1582  _ungetch

0000:1CD6  _wherex

0000:1CE5  _wherey

0000:1000  Abs  __AHINCR

0000:000C  Abs  __AHSHIFT

027C:0114  __atexitcnt

027C:0540  __atexittbl

027C:00A0  __brklvl

027C:0084  __C0argc

027C:0086  __C0argv

0000:144F  __c0crtinit

027C:0088  __C0environ

027C:051D  __cChar

0000:03DD  __cexit

027C:051C  __cFlag

0000:015B  __checknull

0000:0148  __cleanup

0000:1243  __CPUTN

0000:146C  __crtinit

027C:0116  __ctype

0000:0000  Abs  __cvtfak

0000:03EB  __c_exit

027C:038A  __doserrno

0000:0430  __DOSERROR

027C:038C  __dosErrorToSV

027C:008A  __envLng

027C:008C  __envseg

027C:008E  __envSize

027C:0096  __Exception_list

0000:03CB  __exit

027C:0218  __exitbuf

027C:021A  __exitfopen

027C:021C  __exitopen

0000:2024  __fgetc

027C:051E  __first

0000:211F  __fputc

0000:226E  __FPUTN

027C:009C  __heapbase

027C:0388  __heaplen

027C:00A4  __heaptop

027C:0074  __Int0Vector

027C:0078  __Int4Vector

027C:007C  __Int5Vector

027C:0080  __Int6Vector

0000:03F7  __IOERROR

027C:0520  __last

0000:0453  __LONGTOA

0000:0291  __MMODEL

0000:2035  __Nfgetc

027C:035E  __nfile

0000:1565  __Ngetche

0000:25CF  __Nungetc

0000:1582  __Nungetch

027C:0360  __openfd

027C:0092  __osmajor

027C:0093  __osminor

027C:0092  __osversion

027C:0090  __psp

0000:0532  __read

0000:1981  __REALCVT

027C:052A  __RealCvtVector

0000:01DD  __restorezero

027C:0522  __rover

0000:055F  __scanner

0000:198D  __scanpop

0000:1989  __scanrslt

0000:1985  __scantod

027C:052C  __ScanTodVector

0000:0A25  __scantol

0000:1ABD  __SCREENIO

0000:1B70  __SCROLL

0000:0BA4  __setupio

027C:0466  __stklen

027C:021E  __streams

0000:0182  __terminate

0000:0000  Abs  __turboCrt

0000:04D0  __UTOA

0000:1AF9  __VALIDATEXY

027C:0092  __version

027C:04D2  __video

0000:13C4  __VideoInt

0000:0C59  __VPRINTER

0000:110C  __VPTR

0000:1131  __VRAM

0000:1CCC  __wherexy

0000:271D  __write

027C:04D0  __wscroll

0000:2757  __xfflush

0000:11AB  ___brk

027C:009A  ___brklvl

0000:0353  ___ErrorMessage

027C:0098  ___heapbase

0000:2403  ___read

0000:11CD  ___sbrk

0000:2617  ___write

  Address  Publics by Value

0000:0000  Abs  __cvtfak

0000:0000  Abs  __turboCrt

0000:000C  Abs  __AHSHIFT

0000:1000  Abs  __AHINCR

0000:0148  __cleanup

0000:015B  __checknull

0000:0182  __terminate

0000:01DD  __restorezero

0000:028F  DGROUP@

0000:0291  __MMODEL

0000:0293  _main

0000:032F  _atexit

0000:0353  ___ErrorMessage

0000:03BC  _exit

0000:03CB  __exit

0000:03DD  __cexit

0000:03EB  __c_exit

0000:03F7  __IOERROR

0000:0430  __DOSERROR

0000:0442  _isatty

0000:0453  __LONGTOA

0000:04D0  __UTOA

0000:04ED  _lseek

0000:0516  N_SCOPY@

0000:0532  __read

0000:055F  __scanner

0000:0A25  __scantol

0000:0BA4  __setupio

0000:0C59  __VPRINTER

0000:110C  __VPTR

0000:1131  __VRAM

0000:11AB  ___brk

0000:11CD  ___sbrk

0000:11FE  _brk

0000:120A  _sbrk

0000:121A  _clrscr

0000:1243  __CPUTN

0000:1376  _cprintf

0000:13C4  __VideoInt

0000:144F  __c0crtinit

0000:146C  __crtinit

0000:154C  _getch

0000:1565  __Ngetche

0000:1565  _getche

0000:1582  __Nungetch

0000:1582  _ungetch

0000:15A0  _gettext

0000:15F4  _puttext

0000:1648  _kbhit

0000:165A  _movetext

0000:16F7  _free

0000:17C6  _malloc

0000:191D  _realloc

0000:196E  _putch

0000:1981  __REALCVT

0000:1985  __scantod

0000:1989  __scanrslt

0000:198D  __scanpop

0000:1ABD  __SCREENIO

0000:1AF9  __VALIDATEXY

0000:1B70  __SCROLL

0000:1CCC  __wherexy

0000:1CD6  _wherex

0000:1CE5  _wherey

0000:1CF8  _eof

0000:1D6F  _fflush

0000:1DEC  _flushall

0000:1E81  _fseek

0000:1EE5  _ftell

0000:2024  __fgetc

0000:2035  __Nfgetc

0000:2035  _fgetc

0000:20E0  _fgetchar

0000:20E9  _memcpy

0000:2108  _printf

0000:211F  __fputc

0000:2136  _fputc

0000:225D  _fputchar

0000:226E  __FPUTN

0000:2403  ___read

0000:24CB  _scanf

0000:24E9  _setvbuf

0000:25B5  _strlen

0000:25CF  __Nungetc

0000:25CF  _ungetc

0000:2617  ___write

0000:271D  __write

0000:2757  __xfflush

0277:0008  ASMMIN

0277:0037  _asmbs

027C:0000  DATASEG@

027C:0074  __Int0Vector

027C:0078  __Int4Vector

027C:007C  __Int5Vector

027C:0080  __Int6Vector

027C:0084  __C0argc

027C:0086  __C0argv

027C:0088  __C0environ

027C:008A  __envLng

027C:008C  __envseg

027C:008E  __envSize

027C:0090  __psp

027C:0092  __version

027C:0092  __osversion

027C:0092  __osmajor

027C:0093  __osminor

027C:0094  _errno

027C:0096  __Exception_list

027C:0098  ___heapbase

027C:009A  ___brklvl

027C:009C  __heapbase

027C:00A0  __brklvl

027C:00A4  __heaptop

027C:0114  __atexitcnt

027C:0116  __ctype

027C:0218  __exitbuf

027C:021A  __exitfopen

027C:021C  __exitopen

027C:021E  __streams

027C:035E  __nfile

027C:0360  __openfd

027C:0388  __heaplen

027C:038A  __doserrno

027C:038C  __dosErrorToSV

027C:0466  __stklen

027C:04D0  __wscroll

027C:04D2  __video

027C:04E1  _directvideo

027C:051C  __cFlag

027C:051D  __cChar

027C:051E  __first

027C:0520  __last

027C:0522  __rover

027C:052A  __RealCvtVector

027C:052C  __ScanTodVector

027C:053E  _minim

027C:0540  __atexittbl

Error: Undefined symbol __abort in module c0.asm

Error: Undefined symbol __ExceptInit in module c0.asm

Error: Fixup overflow at _TEXT:007E, target = _asmbs in module s2_l1l. c

Error: Fixup overflow at _TEXT:005E, target = ASMMIN in module s2_l1l. c

Error: Undefined symbol _abort in library file c:\bc5\lib\cs. lib in module CVTFAK

Program entry point at 0000:0000