Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 16.06.2014
Сообщений: 2
1

Исправить конец кода для компиляции в TASM

16.06.2014, 19:49. Показов 646. Ответов 1
Метки нет (Все метки)

Здравствуйте. Нашел программу в интернете, надо сдать завтра. В ассемблере не бум бум, но по комментариям разобрался. Компилятор ругается на неожиданный конец файла. Помогите пожалуйста завершить программу.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
CSEG segment
assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
org 100h
Begin:
jmp Init ;На метку инициализации
; Инициализация (подготовка и настройка резидента)
Init:
mov ax,3509h
int 21h ;Получим и сохраним адрес (вектор) 21h прерывания
mov word ptr Int_09h_vect,bx ;Вначале младшее слово (смещение)
mov word ptr Int_09h_vect+2,es ;Затем старшее (сегмент)
mov ax,2509h ;устанавливаем вектор прерывания
mov dx,offset Int_09h_proc 21h ;"Повесим" нашу процедуру на 09h прерывание
mov dx,offset Init
int 27h ;Оставим программу резидентной в памяти.
In_memory db 'Мы уже в памяти!!!!$'
Int_09h_proc proc
pushf ; сохраним флаги и регистры
push axbxcxdxesds
in al, 60h ; читать кнопкуal, 42h ; это F5?
jne go_09h ; если нет - на оригинальный обработчик
in al, 61h ; взять значение порта управления клавиатурой
mov ah, al ; сохранить его
or al, 80h ; установить бит разрешения для клавиатуры
out 61h, al ; и вывести его в управляющий порт
xchg ah, al ; извлечь исходное значение порта
out 61h, al ; и записать его обратно
mov al, 20h ; послать сигнал "конец прерывания
out 20h, al ; контроллеру прерываний 8259
mov ax, 0b800h ; в ax - начальный адрес видеопамяти для текстовых режимов
mov es, ax ; оттуда в es, напрямую с es работать нельзя
xor di, di ; обнуляем di
mov si, offset logfile ; в si - адрес массива, в который будем писать символы с экрана
wr: ; начало цикла записи
movsb ; записать данные из ячейки es:[di] в ячейку ds:[si]
inc si ; si++di ; di++
cmp si, 0b800h ; еще не конец массива?
jne wr ; тогда в цикл
mov ah, 3ch ; создание файла
mov cx, 0 ; атрибут файла - доступен для чтения/записи
mov dx, offset filename ; в dx - адрес переменной, в которой лежит имя файла
int 21h ; прерывание
mov bx, ax ; описатель файла сохраним в bx, потом понадобится
mov cx, 0 ; в cx - смещение указателя
mov dx, 0 ; в dx - база указателя
mov al, 2 ; атрибуты открытия файла
mov ah, 42h ; установка указателя для записи в файл
int 21h ; прерывание
mov ah, 40h ; запись в файл
mov dx, offset logfile ; в dx - адрес массива данных, который будем записывать
mov cx, 0b800h ; в cx - объем записяваемых данных
int 21h ; прерывание
mov ah, 3eh ; закрытие файла
int 21h ; прерывание_09h: ds ; восстановим регистры
pop es ;
pop ds ;cx ;bx ;ax ;;Выровняем стекdword ptr cs:[Int_09h_vect] ;"Прыгаем" на оригинальный обработчик
Int_09h_vect dd ? ;Здесь хранится адрес оргинального обработчика
filename db 'res.txt', 0 ; имя файла, если не указан путь - создается в директории исполняемого файла
logfile db 0b800h dup (0) ; массив данных для записи
Int_09h_proc endp
ends Begin
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2014, 19:49
Ответы с готовыми решениями:

Как исправить ошибки компиляции кода?
#define LED_PIN 13 #define BUTTON_PIN 2 void*setup() { pinMode(LED_PIN,*OUTPUT); //...

Исправить ошибки при компиляции кода
Ребята , был код с индексацией все работало отлично , переделал на указатели , не компилирует...

Где можно посмотреть на ключи компиляции для tasm?
Вообщем пытаюсь слинковать маленький пример с помощью кода C:\Users\mzarb\Desktop\tasm\tlink /Tpe...

Как сделать доступным сегмент кода для записи (tasm)?
32 битная система. собственно вопрос(какие параметры отсылать линковщику)?

1
0 / 0 / 0
Регистрация: 16.06.2014
Сообщений: 2
18.06.2014, 19:24  [ТС] 2
Если кому понадобится, то вот:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
CSEG segment
assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
org 100h
Begin:
jmp Init ;На метку инициализации
; Инициализация (подготовка и настройка резидента)
Init:
mov ax,3509h
int 21h ;Получим и сохраним адрес (вектор) 21h прерывания
mov word ptr Int_09h_vect,bx ;Вначале младшее слово (смещение)
mov word ptr Int_09h_vect+2,es ;Затем старшее (сегмент)
mov ax,2509h ;устанавливаем вектор прерывания
mov dx,offset Int_09h_proc
int 21h ;"Повесим" нашу процедуру на 09h прерывание
mov dx,offset Init
int 27h ;Оставим программу резидентной в памяти.
In_memory db 'Мы уже в памяти!!!!$'
Int_09h_proc proc
pushf ; сохраним флаги и регистры
push ax
push bx
push cx
push dx
push es
push ds
in al, 60h ; читать кнопку
cmp al, 42h ; это F5?
jne go_09h ; если нет - на оригинальный обработчик
in al, 61h ; взять значение порта управления клавиатурой
mov ah, al ; сохранить его
or al, 80h ; установить бит разрешения для клавиатуры
out 61h, al ; и вывести его в управляющий порт
xchg ah, al ; извлечь исходное значение порта
out 61h, al ; и записать его обратно
mov al, 20h ; послать сигнал "конец прерывания
out 20h, al ; контроллеру прерываний 8259
mov ax, 0b800h ; в ax - начальный адрес видеопамяти для текстовых режимов
mov es, ax ; оттуда в es, напрямую с es работать нельзя
xor di, di ; обнуляем di
mov si, offset logfile ; в si - адрес массива, в который будем писать символы с экрана
wr: ; начало цикла записи
movsb ; записать данные из ячейки es:[di] в ячейку ds:[si]
inc si ; si++
inc di ; di++
cmp si, 0b800h ; еще не конец массива?
jne wr ; тогда в цикл
mov ah, 3ch ; создание файла
mov cx, 0 ; атрибут файла - доступен для чтения/записи
mov dx, offset filename ; в dx - адрес переменной, в которой лежит имя файла
int 21h ; прерывание
mov bx, ax ; описатель файла сохраним в bx, потом понадобится
mov cx, 0 ; в cx - смещение указателя
mov dx, 0 ; в dx - база указателя
mov al, 2 ; атрибуты открытия файла
mov ah, 42h ; установка указателя для записи в файл
int 21h ; прерывание
mov ah, 40h ; запись в файл
mov dx, offset logfile ; в dx - адрес массива данных, который будем записывать
mov cx, 0b800h ; в cx - объем записяваемых данных
int 21h ; прерывание
mov ah, 3eh ; закрытие файла
int 21h ; прерывание
Go_09h:
pop ds ; восстановим регистры
pop es ;
pop ds ;
pop cx ;
pop bx ;
pop ax ;
popf ;Выровняем стек
jmp dword ptr cs:[Int_09h_vect] ;"Прыгаем" на оригинальный обработчик
iret
Int_09h_vect dd ? ;Здесь хранится адрес оргинального обработчика
filename db 'res.txt', 0 ; имя файла, если не указан путь - создается в директории исполняемого файла
logfile db 0b800h dup (0) ; массив данных для записи
Int_09h_proc endp
CSEG ends
end Begin
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2014, 19:24

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Исправить ошибки компиляции плагина для 3Ds Max!
Компилирую плагин для 3Ds Max! При компиляции появляются ошибки... Большинство ошибок однотипны...

Автоматизация процесса компиляции (tasm)
как указать чтоб скомпилированные файлы оказывались в той же папке что и батник? заранее спасибо ...

Ошибка при компиляции TASM
Помогите исправить ошибку .386 .model small .data x dq 0.5 n dq 2.0 sum...

Как настроить среду для написания и компиляции кода
Есть одна проблема. Раньше писал на Visual Studio 6, все было Ок! Сейчас работаю в 2005 версии, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.