Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
2 / 1 / 1
Регистрация: 27.10.2015
Сообщений: 35
FASM

При создании директории название обрезается (int 21h ah=39h)

30.01.2021, 14:18. Показов 3963. Ответов 10
Метки fasm (Все метки)

Студворк — интернет-сервис помощи студентам
1) почему при создании директории название обрезается до "temporar"?
2) где найти хороший справочник по 21h? (обычно в гугле находится список из десятки самых часто-используемых, и порой не всегда правильно описывается ввод\вывод)
Например узнать поподробнее про команду 30h
3) как указать откуда начинать программу при директиве use16 и указать сегменты? (если возможно)
использую fasm 1.73.16 и DosBox 0.74-3
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
use16
org 100h
macro write_s str
{
    mov     ah, 9h
    mov     dx, str
    int     21h
}
 
macro write_c char
{
    mov     dl, char
    mov     ah, 2h
    int     21h
}
 
 
macro write_err str
{
    mov     ah, 9h
    mov     dx, str
    int     21h
    mov     ax, 4c00h
    int     21h
}
 
 
macro exit_dos
{
    mov     ax, 4c00h
    int     21h
}
 
macro get_dos_ver
{
    mov     dx, dosv   ;
    mov     ah, 9h     ;
    int     21h        ;
                       ;
    mov     ah, 30h    ;get dos version
    int     21h        ;
    push    ax         ;
    add     al, ch_ofs ;char offset for major
    write_c al         ;
    write_c '.'        ;
    pop     ax         ;
    mov     al, ah     ;put minor part
    mov     bl, 10     ;
    xor     ah, ah     ;haha, classic :)
    div     bl         ;idk why but let it be as is
    add     al, ch_ofs ;char offset for minor part
    write_c al         ;
}
   mov dx, tempdir     ; |make dir
    mov ah, 39h        ; |
    int 21h            ; |
    jnc dir_succ       ;    |without any errors
 
      cmp ax, 3h       ;
      je pnf_err       ; if error is "path not found"
      write_err adm    ; ax should be equals to 3
      pnf_err:         ; otherwise equals to 5
      write_err pnfm   ; where error is "access denided"
 
    dir_succ:          ;    |
    write_s dcm        ;    |
    get_dos_ver
 
    exit_dos
    ;const
    ch_ofs=30h         ;ascii offset
 
    ;variables
    tempdir db "c:\temporary",0
    filename  db "temp.txt$"
 
    ;messages
    dcm       db "dir was created",13,10,"$"
    ;fcm      db "file was created",13,10,$
    ;fom      db "file was open",13,10,$
    ;fwm      db "file was written",13,10,$
    ;fclm     db "file was closed",13,10,$
    ;fcpm     db "copying was successful",13,10,$
    ;fdm      db "file was deleted",13,10,$
    ;frm      db "file was renamed",13,10,$
    dosv      db "Dos ver: $"
 
    ;errMessages
    pnfm      db "path not found",13,10,"$"
    adm       db "access denided",13,10,"$"
    ;ircdm db "impossible remove curr dir",13,10,$
    ;tmofm db "too much opened files",13,10,$
    ;fnfm db "file not found",13,10,$
    ;amwm db "access mode is wrong",13,10,$
    ;wim db "wrong id",13,10,$
    ;werm db "write doesn't ended properly",13,10,$
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2021, 14:18
Ответы с готовыми решениями:

Ввод строки при помощи int 21h ah=06h
Нужно произвести ввод в 10сс, как отрицательных так и положительных чисел через это прерывание: mov ah,06h int 21h. Через другие прерывания...

Почему с AH=2\Int 1ah работает, а с AH=2ch\Int 21h нет
написал вот такой вот таймер, но преподавателю не нравится формат BCD) переписал с AH=2ch\Int 21h - в цикле процедуры ConPlay не...

При помощи функции 0Ah int 21h ввести строчку с клавиатуры, а потом вывести ее на экран
нужно при помощи функции 0Ah int 21h ввести строчку с клавиатуры, а потом вывести ее на экран. Почему не выводит на экран, что не так???...

10
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
30.01.2021, 15:05
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

1. В системе DOS имя файла или каталога не может иметь более 8 символов в имени и более 3 символов в расширении.
2
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
30.01.2021, 15:39
Лучший ответ Сообщение было отмечено Shin0_kaze как решение

Решение

Цитата Сообщение от Shin0_kaze Посмотреть сообщение
почему
Читайте хелп FASM
3)Если org 100h, ENTRY указывать не нужно.
2) Ralf Brown's Interrupt List.
1)
Цитата Сообщение от quwy Посмотреть сообщение
не может иметь более 8 символов в имени и более 3
В основном Да(если использовать основные функции), но есть ещё и расширенные функции: Windows95 - LONG FILENAME FUNCTIONS

На DosBox сильно не надейтесь, DosBox - эмулятор, т.е. Гость и не всегда ОСь-Хозяйка позволить ОСи-Гостье у себя командовать.
2
2 / 1 / 1
Регистрация: 27.10.2015
Сообщений: 35
30.01.2021, 18:15  [ТС]
а если очень хочется указать entry point? но при use16 слово entry выдает illegal instruction.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
30.01.2021, 20:12
В DOS есть несколько типов исполняемых программ - DOS COM и DOS EXE.
Они в исходнике различаются структурой оформления, а в исполняемом виде - количеством памяти и организацией этой памяти.

FASM DOS COM
Assembler
1
2
3
4
5
6
7
8
9
10
11
use16                                   ;Генерировать 16-битный код
org 100h                                ;Программа начинается с адреса 100h
 
        mov     dx,     hello           ;В DX адрес строки.
        mov     ah,     9               ;Номер функции DOS.
        int     21h                     ;Обращение к функции DOS.
 
        mov     ax,     4C00h           ;В регистр AH помещаем 4Ch, в AL – 00h.
        int     21h                     ;Завершение программы
;-------------------------------------------------------
hello db 'Hello, world!$'
FASM DOS EXE
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
format  MZ                      ;Исполняемый файл DOS EXE (MZ EXE)
entry   code_seg:start          ;Точка входа в программу
;--------------------------------------------------------------------
stack   200h                    ;Размер стека
;--------------------------------------------------------------------
segment data_seg                ;Cегмент данных
        CrLf            db      0Dh, 0Ah, '$'   ;перевод строки
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
;--------------------------------------------------------------------
segment code_seg                ;Сегмент кода
start:                                  ;Точка входа в программу
        mov     ax,     data_seg        ;Инициализация регистра DS
        mov     ds,     ax
 
        mov     ah,     09h
        mov     dx,     msgPressAnyKey
        int     21h
        mov     ah,     0
        int     16h
 
        mov     ax,     4C00h
        int     21h                     ;Завершение программы
FASM DOS EXE
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
; fasm example of writing multi-segment EXE program
 
format MZ
 
entry main:start            ; program entry point
stack 100h              ; stack size
 
segment main                ; main program segment
 
  start:
    mov ax,text
    mov ds,ax
 
    mov dx,hello
    call    extra:write_text
 
    mov ax,4C00h
    int 21h
 
segment text
 
  hello db 'Hello world!',24h
 
segment extra
 
  write_text:
    mov ah,9
    int 21h
    retf
Кроме всеобъемлющего Ральфа Брауна есть ещё и TechHelp http://www.techhelpmanual.com/2-main_menu.html
2
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
30.01.2021, 20:34
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
FASM DOS COM
. .
FASM DOS EXE
Я его отправил в мануал, пусть хоть буквы знакомые найдет, а может новые выучит.
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
30.01.2021, 21:16
Давно читал мануал к FASM, уже забыл, что exe и com там разъясняются.
1
2 / 1 / 1
Регистрация: 27.10.2015
Сообщений: 35
31.01.2021, 14:40  [ТС]
Спасибо за ответы.

Мануал я читал, мне просто интересно есть ли у COM формата аналог entry
(как всегда можно просто прыжком перейти на нужную строчку)

https://fasmworld.ru/uchebnyj-... dresaciya/
Про сегменты немного не понял, в начале говорится, что есть сегменты code, data, stack, extra
а потом во втором примере он просто называет seg1, seg2, seg3, seg4...

насколько я знаю в других "asm" есть assume, где можно установить соответствие между ds, es, ss, cs регистрами и сегментами.
Играет ли это какую то важную роль?

Еще долго мучаюсь вопросом как лучше организовать прыжки, их конечно можно сделать по разному.
например после каждой команды делать миниатюрный обработчик ошибок,
или в конце программы сделать один большой обработчик.
(Кому то может это показаться ерундой, но я часто на таких вопросах выбора надолго застреваю.)
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
31.01.2021, 15:18
Есть книга по ассемблеру для DOS
Питер Абель. Ассемблер и программирование для IBM PC
В ней рассматривается разница между DOS COM и DOS EXE программами.
В общих чертах, DOS COM примитивный формат - чистый образ программы, не настраивается ни точка входа, ни размеры памяти для сегментов - только в самом начале отводится 256 (100h) байт для PSP, чтобы хоть немного похволить взаимодействовать с операционной системой.

Сегменты - начало деления на сегменты идёт из программной модели i8086 - опять же, есть у Абеля.

Assume - директива компилятора, которая упрощает для компилятора (упрощает логику работы компилятора) вычисления смещений переменных, полей в структурах данных. Т.е. assume показывает, от какого базового адреса вычислять смещения и подставлять их в виде констант в инструкции. Эту директиву требуют tasm и masm, остальные компиляторы как-то без неё обходятся.

Обработчик ошибок - делайте как угодно, хоть сразу проверяйте и реагируйте, хоть в какой-то общий отправляйте, хоть исключения реализуйте. Для почти вышедшего из обихода DOS это ничего не изменит, а вы потренируетесь.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
05.02.2021, 16:49
Если нужна точка входа, просто в начале кода делаете jmp Метка.
А дальше уже размещаете данные, процедуры и пр. Так иногда делают, но смысла в этом, как правило, нет (в boot-секторе, например, смысл есть, или при создании TSR – резидентных программ).
Проще точку входа сделать в начале, а всё остальное – после.
1
2 / 1 / 1
Регистрация: 27.10.2015
Сообщений: 35
08.02.2021, 17:14  [ТС]
Я так и делаю дебажить функции по одной удобно например.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2021, 17:14
Помогаю со студенческими работами здесь

Ошибка при создании директории
Всем доброго врмени суток! НЕ моуг понять почему выдает мне ошибку. <div style="background:white;"> <?php //...

Атрибуты прав при создании директории
Пишу mkdir("dir0777",0777); mkdir("dir0770",0770); mkdir("dir0707",0707); mkdir("dir0077",0077); Для владельца - права...

Действие int 21h
ааа ну вроде я понял вниз кароч отсчитываем пока не будет делимое число и количество отсчитываний и будет твой остаток? число 150 /2 =7,1...

Перехват int 21h
com 16 bit .286 ASKII_code_key_check equ 'A' ASKII_code_key equ 'B' number_handler_int21_02h equ 02h ...

Перехват int 21h
Подскажите пожалуйста. Как передать управление оригинальному обработчику 21h? CSEG Segment ASSUME CS:CSEG org 100h begin: ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru