- •Щемелева т.К.
- •Архитектура и программирование реального режима микропроцессоров фирмы intel
- •Учебное пособие
- •Пермь 2001
- •Содержание
- •1.2.Переводы между позиционными системами счисления
- •1.3.Система кодирования символов ascii
- •1.4. Преобразование строки ascii-кодов в двоичное и шестнадцатеричное число
- •1.5. Применение систем счисления в эвм
- •1.6. Контрольные вопросы и задания
- •Тема 2. Представление данных на языке ассемблера и их хранение в памяти пк
- •2.1. Биты, байты и слова
- •2.3. Размещение различных типов данных в памяти пк
- •2.4. Отрицательные числа
- •2.5. Контрольные вопросы и задания
- •Тема 3. Элементы архитектуры персонального компьютера: сегментная память и регистровая структура микропроцессора
- •3.1. Понятие сегмента
- •3.2. Способ адресации ячеек сегментированной памяти
- •3.4. Программистская модель мп i8086. Назначение регистров.
- •Регистры общего назначения
- •Регистры сегментов и указатель команд
- •3.5. Контрольные вопросы и задания
- •Тема 4. Создание программы в ехе-формате
- •4.1. Программы на языке транслятораMasm.
- •4.1.1. Определение сегментов и данных.
- •4.1.2. Структура программы.
- •4.2. Программы на языке транслятораTasm.
- •4.2.1. Особенности транслятора.
- •4.2.2. Определение сегментов и данных .
- •4.2.3. Директива model.
- •4.2.4. Директивы упрощенного описания сегментов.
- •4.2.5. Структура программы.
- •4.2.6. Директивы startupcode и exitcode.
- •4.3. Контрольные вопросы и задания
- •Тема 5. Способы адресации данных в командах языка ассемблер
- •5.1. Регистровая адресация
- •5.2. Непосредственная адресация.
- •5.3. Прямая адресация.
- •5.4. Косвенная регистровая.
- •5.5. Адресация по базе.
- •5.6. Индексная адресация.
- •5.7. Адресация по базе с индексированием.
- •5.8. Контрольные задания.
- •Тема 6. Основные команды языка Ассемблер
- •6.1. Команды пересылки.
- •1) Пересылка данных
- •2) Пересылка адресов
- •4) Пересылка в стек и из стека
- •6.2. Арифметические операции.
- •2) Арифметические операции над двоичными кодами.
- •3) Команда сравнения:
- •6.3. Команды корректировки.
- •6.4. Команды логических операций.
- •1) Поразрядные логические операции:
- •2) Команды сдвига
- •6.5. Команды передачи управления.
- •6.6. Команды организации цикла.
- •6.7. Команды вызова процедур и возврата из них.
- •6.8. Команды прерываний и возврата из них.
- •6.8.1. Функции ввода/выводаDos.
- •6.8.2. ФункцииBios управления экраном.
- •Тема 7. Стек
- •7.1.Стек и сегмент стека
- •7.2.Стековые команды
- •7.3. Доступ к элементам стека
- •Тема 8. Практическая работа на пк.
- •Тема 9. Создание линейных программ
- •9.1 Создание линейной программы.
- •9.1.1. Составление текста программы.
- •9.1.2 Трансляция.
- •9.1.3. Создание исполняемого файла
- •9.1.4.Отладка программы в turbo debugger’е
- •9.2. Контрольные вопросы и задания
- •Тема 10. Организация ветвлений.
- •10.1.Флаги и их назначение.
- •10.2 Команда безусловного перехода jmp
- •10.3 Команды условных переходов
- •10.4. Создание разветвленной программы.
- •10.4.1. Составление текста программы.
- •10.4.2.Трансляция.
- •10.4.3. Создание исполняемого файла.
- •10.5. Контрольные вопросы и задания
- •Тема 11. Организация циклов
- •11.1. Команды управления циклом
- •11.2.Создание циклической программы.
- •11.2.1.Составление текста программы.
- •11.2.2.Трансляция.
- •11.2.3.Создание исполняемого файла
- •11.2.4.Отладка программы в turbo debugger’е
- •11.3. Контрольные вопросы и задания
- •Тема 12. Циклическая разветвленная программа
- •12.1.Создание программы.
- •12.1.1.Составление программы
- •12.1.2.Трансляция.
- •12.1.3.Создание исполняемого файла.
- •12.1.4. Отладка программы в turbo debugger’е
- •12.2.Контрольные вопросы
- •12.3. Контрольные задания
- •Тема 13. Связь ассемблера с языкомPascal.
- •13.1 Общие положения
- •13.2 Организация связи
- •13.3 Передача аргументов (и возврат результата в случае функции)
- •13.4 ДирективаArg
- •13.5 Использование операндов директивыmodel
- •13.6 Передача данных остальных типовPascal
- •13.7 Возврат значения в программу наPascal
- •13.8 КомандыEnter иLeave
- •13.9 Итоги
- •Листинг 1.2. Ассемблерное представление.
- •Тема 16. Рекомдации начинающему программисту
- •Тема 17. Контрольная работа
- •Список литературы
- •Приложение 1 Инструкция по работе с программой Turbo Debugger.
- •Приложение 2 Практическая работа на пк
- •Приложение 3 ключи командной строкиtasmиtlink
Листинг 1.2. Ассемблерное представление.
TITLE prg19_1.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
; COMDAT ??8@YAHABU_GUID@@0@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC ?szClassWindow@@3PADA ; szClassWindow
_DATA SEGMENT
?szClassWindow@@3PADA DB 0caH, 0e0H, 0f0H, 0eaH, 0e0H, 0f1H, 0edH, 0eeH, 0e5H
DB 0cfH, 0f0H, 0e8H, 0ebH, 0eeH, 0e6H, 0e5H, 0edH, 0e8H, 0e5H, 00H ; szClassWindow
_DATA ENDS
PUBLIC _WinMain@16
PUBLIC ?WindowProc@@YGJPAUHWND__@@IIJ@Z ; WindowProc
EXTRN __imp__GetMessageA@16:NEAR
EXTRN __imp__TranslateMessage@4:NEAR
EXTRN __imp__DispatchMessageA@4:NEAR
EXTRN __imp__UpdateWindow@4:NEAR
EXTRN __imp__RegisterClassExA@4:NEAR
EXTRN __imp__CreateWindowExA@48:NEAR
EXTRN __imp__ShowWindow@8:NEAR
EXTRN __imp__LoadCursorA@8:NEAR
EXTRN __imp__LoadIconA@8:NEAR
EXTRN __imp__GetStockObject@4:NEAR
_DATA SEGMENT
$SG29710 DB 0caH, 0e0H, 0f0H, 0eaH, 0e0H, 0f1H, ' ', 0efH, 0f0H, 0eeH
DB 0e3H, 0f0H, 0e0H, 0ecH, 0ecH, 0fbH, ' ', 0e4H, 0ebH, 0ffH, ' W'
DB 'in32 ', 0edH, 0e0H, ' ', 0d1H, '++', 00H
_DATA ENDS
_TEXT SEGMENT
; File prg19_1.cpp
_lpMsg$ = -32
_wcl$ = -80
_hInst$ = 8
_nCmdShow$ = 20
_hWnd$ = -4
_WinMain@16 PROC NEAR
; Line 5
push ebp
mov ebp, esp
sub esp, 80 ; 00000050H
push ebx
push esi
push edi
; Line 10
mov DWORD PTR _wcl$[ebp], 48 ; 00000030H
; Line 11
mov DWORD PTR _wcl$[ebp+4], 3
; Line 12
mov DWORD PTR _wcl$[ebp+8], OFFSET FLAT:?WindowProc@@YGJPAUHWND__@@IIJ@Z ; WindowProc
; Line 13
mov DWORD PTR _wcl$[ebp+12], 0
; Line 14
mov DWORD PTR _wcl$[ebp+16], 0
; Line 15
mov eax, DWORD PTR _hInst$[ebp]
mov DWORD PTR _wcl$[ebp+20], eax
; Line 16
push 32512 ; 00007f00H
push 0
call DWORD PTR __imp__LoadIconA@8
mov DWORD PTR _wcl$[ebp+24], eax
; Line 17
push 32512 ; 00007f00H
push 0
call DWORD PTR __imp__LoadCursorA@8
mov DWORD PTR _wcl$[ebp+28], eax
; Line 18
push 0
call DWORD PTR __imp__GetStockObject@4
mov DWORD PTR _wcl$[ebp+32], eax
; Line 19
mov DWORD PTR _wcl$[ebp+36], 0
; Line 20
mov DWORD PTR _wcl$[ebp+40], OFFSET FLAT:?szClassWindow@@3PADA ; szClassWindow
; Line 21
mov DWORD PTR _wcl$[ebp+44], 0
; Line 24
lea eax, DWORD PTR _wcl$[ebp]
push eax
call DWORD PTR __imp__RegisterClassExA@4
movzx eax, ax
test eax, eax
jne $L29705
; Line 25
xor eax, eax
jmp $L29694
; Line 27
$L29705:
; Line 39
push 0
mov eax, DWORD PTR _hInst$[ebp]
push eax
push 0
push 0
push -2147483648 ; 80000000H
push -2147483648 ; 80000000H
push -2147483648 ; 80000000H
push -2147483648 ; 80000000H
push 13565952 ; 00cf0000H
push OFFSET FLAT:$SG29710
push OFFSET FLAT:?szClassWindow@@3PADA ; szClassWindow
push 0
call DWORD PTR __imp__CreateWindowExA@48
mov DWORD PTR _hWnd$[ebp], eax
; Line 41
mov eax, DWORD PTR _nCmdShow$[ebp]
push eax
mov eax, DWORD PTR _hWnd$[ebp]
push eax
call DWORD PTR __imp__ShowWindow@8
; Line 42
mov eax, DWORD PTR _hWnd$[ebp]
push eax
call DWORD PTR __imp__UpdateWindow@4
; Line 44
$L29712:
push 0
push 0
push 0
lea eax, DWORD PTR _lpMsg$[ebp]
push eax
call DWORD PTR __imp__GetMessageA@16
test eax, eax
je $L29713
; Line 46
lea eax, DWORD PTR _lpMsg$[ebp]
push eax
call DWORD PTR __imp__TranslateMessage@4
; Line 47
lea eax, DWORD PTR _lpMsg$[ebp]
push eax
call DWORD PTR __imp__DispatchMessageA@4
; Line 48
jmp $L29712
$L29713:
; Line 49
mov eax, DWORD PTR _lpMsg$[ebp+8]
jmp $L29694
; Line 50
$L29694:
pop edi
pop esi
pop ebx
leave
ret 16 ; 00000010H
_WinMain@16 ENDP
_TEXT ENDS
EXTRN __imp__DefWindowProcA@16:NEAR
EXTRN __imp__PostQuitMessage@4:NEAR
_TEXT SEGMENT
_hWnd$ = 8
_message$ = 12
_wParam$ = 16
_lParam$ = 20
?WindowProc@@YGJPAUHWND__@@IIJ@Z PROC NEAR ; WindowProc
; Line 55
push ebp
mov ebp, esp
sub esp, 4
push ebx
push esi
push edi
; Line 56
mov eax, DWORD PTR _message$[ebp]
mov DWORD PTR -4+[ebp], eax
jmp $L29719
; Line 58
$L29723:
; Line 59
push 0
call DWORD PTR __imp__PostQuitMessage@4
; Line 60
jmp $L29720
; Line 61
$L29724:
; Line 64
mov eax, DWORD PTR _lParam$[ebp]
push eax
mov eax, DWORD PTR _wParam$[ebp]
push eax
mov eax, DWORD PTR _message$[ebp]
push eax
mov eax, DWORD PTR _hWnd$[ebp]
push eax
call DWORD PTR __imp__DefWindowProcA@16
jmp $L29718
; Line 65
jmp $L29720
$L29719:
cmp DWORD PTR -4+[ebp], 2
je $L29723
jmp $L29724
$L29720:
; Line 66
xor eax, eax
jmp $L29718
; Line 67
$L29718:
pop edi
pop esi
pop ebx
leave
ret 16 ; 00000010H
?WindowProc@@YGJPAUHWND__@@IIJ@Z ENDP ; WindowProc
_TEXT ENDS
END
Код листинга 1.2 показывает, что он оформлен как полноценная программа на ассемблере. Код программы был сгенерирован компилятором VisualC++ 4.0 , поэтому трансляторMASMможет сделать на него загрузочный модуль дополнительного редактирования.Таким образом, имея исходный файлWindows-приложения на языке С/С++, можно получить текст на языке ассемблера