Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/43: Рейтинг темы: голосов - 43, средняя оценка - 4.77
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
1

Процедуры, прерывания [FASM]

14.11.2013, 00:09. Показов 8342. Ответов 53
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Составить процедуру, которая представляет на экране текст из нескольких предложений в виде отдельных фраз с заголовком – нумерацией, например:
Предложение-1:
…………………
Предложение-2:
…………………
и т.д.
использовать эту процедуру для решения следующей задачи: ввести текст из нескольких предложений и вывести его на экран в заданном виде, закончив в главной программе завершающей строкой, выделив её цветом или мерцанием.
У FASM бзик на процедуры? ибо классический синтаксис не работает, использую обыкновенные метки с ret

Выделил то, что не понятно или не реализовано.

Впервые сталкиваюсь с прерываниями и процедурами и как следствие, творение рук моих не работает... где ошибся?

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
format PE Console 4.0
entry Start
 
include 'win32a.inc'
 
section '.data' data readable writeable
 
Maxlen db 255
Actlen db ?
buffer rb 256
line db 'String $'
eline db 'ardos $',05h
 
section '.text' code readable executable
 
Start:
xor eax,eax
xor edx,edx
xor ebx,ebx  
call input
call head
 
call endline
 
input:
mov ah, 0Ah
lea dx, [Maxlen]
int 21h
ret
 
head:
lea dx, [line]
mov ah,09h
int 21h
ret
 
endline:
lea dx, [eline]
mov ah,09h
int 21h
mov ax, 1003h
mov bl, 1
int 10h
 
Exit:
  invoke  ExitProcess, 0
 
section '.idata' import data readable
 
  library kernel, 'KERNEL32.DLL'
 
  import kernel,\
    ExitProcess, 'ExitProcess'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2013, 00:09
Ответы с готовыми решениями:

[Вопрос] Перехват прерывания прямым доступом к вектору прерывания
Всех приветствую! В данный момент разбираюсь с обработкой аппаратного прерывания (прерывание...

Обработчик прерывания int 21h (по книге Калашникова)
Доброе время суток, я чтиаю книгу Калашникова-Ассемблер и уже втрой день не могу понять почему...

Реализация функции 42h прерывания 13h на FASM
Реализация функции 42h прерывания 13h на FASM. Как это реализовать? Номер устройства при загрузке в...

[FASM] Переделка процедуры
Имею процедуру: proc WindowProc hWindowHandle, wMessage, wParam, lParam push ebx esi edi...

53
336 / 18 / 1
Регистрация: 15.05.2012
Сообщений: 22
14.11.2013, 02:26 2
Satansoft, путь решение этой проблемы мне видится таким:
o Разобраться с основными архитектурными различиями MS DOS и Windows.
o Какие бывают режими работы процессора.
o Все же определиться, под какую платформу нужно написать программу.
Не иначе.
1
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
14.11.2013, 02:33  [ТС] 3
Цитата Сообщение от rotas Посмотреть сообщение
путь решение этой проблемы мне видится таким
это DOS: прерывания и FASM'овские особенности объявления процедур. В то время, как процедуры относительно ясны, в использовании прерываний я юный падаван, от того требуется взор опытного мастера-джедая.
0
336 / 18 / 1
Регистрация: 15.05.2012
Сообщений: 22
14.11.2013, 03:05 4
Satansoft,
format PE Console 4.0
это DOS:
Наблюдается некое понятийное расхождение.
Почитайте прилагающуюся к fasm справочку, особенно главу 2.4.1 MZ executable.
2
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
14.11.2013, 04:53 5
Товарищ rotas уже всё сказал. Но попробую по другому объяснить.

Процедуры DOS'осовские, а заголовок и конец Windows'кий. Так работать, не будет!

Если пишешь для DOS, то всё должно быть DOS'овское. Тоже правило и для других осей.
2
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
14.11.2013, 23:02  [ТС] 6
Видимо я изначально понимал о чем речь, но ось у меня x64 и х16 программы не работают, из положения можно выйти используя API и высокоуровневые функции?

Добавлено через 4 часа 54 минуты
Новая версия фолианта, который даже в отладчике не проверишь из-за 64-битности, DOSbox же и вовсе зависает.
Ввод/вывод синтаксически верен? НЕ ясен нюанс максимальной и фактической длины строки на ввод...как система вообще различает где что?

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
format MZ
 
use32
org 100h
 
Maxlen db 255
Actlen db ?
buffer rb 256
line db 'String $'
eline db 'ardos $',05h
 
Start:
xor eax,eax
xor edx,edx 
call input
call head
call task
call endline
 
input:
mov ah, 0Ah
movsx dx, [Maxlen]
int 21h
ret
 
head:
movsx dx, [line]
mov ah,09h
int 21h
ret
 
task:
movsx dx, [Maxlen]
int 21h
ret
 
endline:
movsx dx, [eline]
mov ah,09h
int 21h
mov ax, 1003h
mov bl, 1
int 10h
 
Exit:
mov ax, 4C00h
int 21h
0
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.11.2013, 00:15 7
Цитата Сообщение от Satansoft Посмотреть сообщение
Видимо я изначально понимал о чем речь, но ось у меня x64 и х16 программы не работают, из положения можно выйти используя API и высокоуровневые функции?
Да, можно на API написать.
Цитата Сообщение от Satansoft Посмотреть сообщение
DOSbox же и вовсе зависает.
И немудрено! Код не правельный, изначально.
Цитата Сообщение от Satansoft Посмотреть сообщение
НЕ ясен нюанс максимальной и фактической длины строки на ввод...как система вообще различает где что?
Мне пока тоже.
0
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
15.11.2013, 00:20  [ТС] 8
Цитата Сообщение от XiloManX Посмотреть сообщение
И немудрено! Код неправильный, изначально.
Можно конкретней на примере кода?
0
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.11.2013, 00:31 9
Цитата Сообщение от Satansoft Посмотреть сообщение
Можно конкретней на примере кода?
Ну например, строка 3. DOS 16 битная. Во-вторых, адрес передаётся без скобочек. Ещё строки 13 и 14, неверны.
1
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
15.11.2013, 00:38  [ТС] 10
Цитата Сообщение от XiloManX Посмотреть сообщение
DOS 16 битная.
Assembler
1
use16
Цитата Сообщение от XiloManX Посмотреть сообщение
Во-вторых, адрес передаётся без скобочек
(пример для ввода)
Assembler
1
2
3
4
5
input:
mov dx, buf
mov ah, 0Ah
int 21h
ret
Цитата Сообщение от XiloManX Посмотреть сообщение
Ещё строки 13 и 14, неверны.
там лишь обнуления регистров, в чем ошибка?
0
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
15.11.2013, 00:40  [ТС] 11
После корректировок ругается на содержимое регистра сегмента кода.
Миниатюры
Процедуры, прерывания [FASM]  
0
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.11.2013, 00:53 12
Цитата Сообщение от Satansoft Посмотреть сообщение
Цитата Сообщение от XiloManX Посмотреть сообщение
Ещё строки 13 и 14, неверны.
там лишь обнуления регистров, в чем ошибка?
В 16 битном режиме, 32 битные регистры не используются по определению.

Добавлено через 11 минут
Строки: 22, 27, 33, 38, тоже не в тему. Зачем расширять знаком, адрес?
1
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
15.11.2013, 00:54  [ТС] 13
Как организовывается ввод?

Функция 0Ah 21h прерывания требует:
Максимальную длину буфера (без учета 0dh)
Действительную длину буфера и сам буфер (с учетом 0dh)

Но как компилятор ориентируется где что?
Вариант объявления:
Assembler
1
2
3
Maxlen db 255
Actlen db 0
buf db 256 dup ?
ввод:
Assembler
1
2
3
4
5
input:
mov dx, buf
mov ah, 0Ah
int 21h
ret
Добавлено через 54 секунды
Актуальный код:
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
format MZ
 
use16
org 100h
 
Maxlen db 255
Actlen db 0
buf db 256 dup ?
line db 'String$'
eline db 'ardos$',05h
 
Start:
xor ax,ax
xor dx,dx 
call input
call head
call task
call endline
 
input:
mov dx, buf
mov ah, 0Ah
int 21h
ret
 
head:
mov dx, line
mov ah,09h
int 21h
ret
 
task:
mov dx, Maxlen
mov ah,09h
int 21h
ret
 
endline:
mov dx, eline
mov ah,09h
int 21h
mov ax, 1003h
mov bl, 1
int 10h
 
Exit:
mov ax, 4C00h
int 21h
Цитата Сообщение от XiloManX Посмотреть сообщение
Строки: 22, 27, 33, 38, тоже не в тему. Зачем расширять знаком, адрес?
Уже записывается адрес.
0
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.11.2013, 01:14 14
Как я понял, должно быть так (для ф.0Ah 21h):

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 buf_max_len equ 255
 str_len: db 0
 buf: rb buf_max_len 
 
 mov [buf+0], buf_max_len  ; максимальный размер буфера.
 mov [buf+1], str_len         ; длина введённой строки текста "Actlen".
 
input:
mov dx, buf
mov ah, 0Ah
int 21h
ret
Цитата Сообщение от Satansoft Посмотреть сообщение
Уже записывается адрес.
Ну, тады ладно.
0
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
15.11.2013, 01:28  [ТС] 15
Цитата Сообщение от XiloManX Посмотреть сообщение
buf_max_len equ 255
Загоняет в этот самый буфер черт знает что... equ заменено на db
Цитата Сообщение от XiloManX Посмотреть сообщение
mov [buf+0], buf_max_len *; максимальный размер буфера.
*mov [buf+1], str_len * * * * ; длина введённой строки текста "Actlen".
Ругаецо на размерности... не понятно как это работает)
0
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.11.2013, 04:22 16
Nf-lf

Добавлено через 6 минут
Цитата Сообщение от Satansoft Посмотреть сообщение
Ругаецо на размерности... не понятно как это работает)
Спать хочу. Ошибки полезли.

Добавлено через 5 минут
Щас всё будет.

Добавлено через 2 часа 29 минут
Вот, переделал малость. Работает, но без мерцания. Функцию мерцания надо делать отдельно. Та что используется, скорее всего, у тебя работать не будет (у меня, не работает). Может завтра сделаю, если получится, а сейчас спать буду (с ног валюсь).

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
format MZ
 
use16
org 100h
 
Maxlen  equ  255
CRLF    equ  13,10
 
Start:
    mov [line+7], byte '1'
 
    call    input
    call    head
 
    call    task
    call    endline
 
    mov ah, 00h
    int 16h
 
    mov     ax, 4C00h
    int     21h
 
; FUNCTION AREA.
 
input:
    xor si, si
 
    mov cx, (Maxlen-3)
    
 .get_char:
;   xor al, al
 
    mov ah, 01h
    int 21h
 
    cmp al, 0dh
    je  .exit
 
    mov [buf+si], al
    inc si
 
    dec cx
    jnz .get_char
    
 .exit:
        mov     [buf+si+0], 13
        mov     [buf+si+1], 10
        mov     [buf+si+2], '$'
    ret
 
head:
    mov dx, line
    mov ah, 09h
    int 21h
    ret
 
task:
    mov dx, buf_max_len
    mov ah, 09h
    int 21h
    ret
 
endline:
    mov dx, eline
    mov ah, 09h
    int 21h
 
;       here must be function blinking.
 
        ret
 
; DATA AREA.
 
buf_max_len: db 'Max buffer length: 255', CRLF,'$'
line:        db 'String  :', CRLF
buf          rb  255         
eline:       db 'End of string', CRLF,'$'
1
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
15.11.2013, 15:55  [ТС] 17
Вы таки решили функцией посимвольного ввода реализовать?

Что за строки?

Цитата Сообщение от XiloManX Посмотреть сообщение
mov [line+7], byte '1'
Цитата Сообщение от XiloManX Посмотреть сообщение
.exit:
* * * * mov * * [buf+si+0], 13
* * * * mov * * [buf+si+1], 10
* * * * mov * * [buf+si+2], '$'
Сама программа не запускается, окно открывается и сразу гаснет...
0
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.11.2013, 16:06 18
Цитата Сообщение от Satansoft Посмотреть сообщение
Вы таки решили функцией посимвольного ввода реализовать?
Именно так.
Цитата Сообщение от Satansoft Посмотреть сообщение
mov [line+7], byte '1'
Пишет число 1, в строку line: db 'String :', CRLF.
Цитата Сообщение от Satansoft Посмотреть сообщение
.exit:
* * * * mov * * [buf+si+0], 13 ; возврат каретки.
* * * * mov * * [buf+si+1], 10 ; перевод строки.
* * * * mov * * [buf+si+2], '$' ; конец строки.
Цитата Сообщение от Satansoft Посмотреть сообщение
Сама программа не запускается, окно открывается и сразу гаснет...
Странно... у меня работает замечательно.
1
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
15.11.2013, 16:08  [ТС] 19
Цитата Сообщение от XiloManX Посмотреть сообщение
Странно... у меня работает замечательно.
На виртуалке мигнуло, в DOSbox выбило 2 раза String и висяк... панико-панико...
0
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.11.2013, 16:14 20
Вот скрины и бинарник.
Миниатюры
Процедуры, прерывания [FASM]   Процедуры, прерывания [FASM]  
Вложения
Тип файла: zip Proc.zip (321 байт, 3 просмотров)
1
15.11.2013, 16:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2013, 16:14
Помогаю со студенческими работами здесь

Добавление процедуры прерывания в класс
Добрый вечер! К примеру написал я класс на с++, для работы которого надо прерывание по...

Вызываю dll (написанную на vc++2008) из Fasm. Через 40 секунд вылет из программы.Без вызова dll из Fasm программа не вылетает.
Программа на vc++2008: #include "MathFuncsDll.h" #include <stdexcept> using namespace std; ...

Вычислить адрес вектора прерывания по номеру прерывания.
17. По заданному номеру прерывания (13 h) вычислите логические адреса хранения исходных адресов...

Вызов прерывания в обработке прерывания
В программе,нажатие кнопки вызывает прерывание,в котором оно обрабатывается.Попутно в обработке...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru