Нижегородский Государственный Технический Университет
им.
Лабораторная работа№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


