Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: A1exSun
Дата сообщения: 11.04.2012 19:58

Код: filename_in db "Введiть iм'я файлу: $"
filename db 244, 0, 244 dup(0)
file_exists db "Файл з таким iменем вже iснує.$"
...
; введення iменi файлу
lea dx, filename_in
call print
lea dx, filename
call scan
xor bx, bx
mov bh, filename+1
add bx, 2
mov filename[bx], 0
; створення файлу
mov ah, 5Bh
xor cx, cx ; звичайний файл
lea dx, filename
int 21h
jnc file_created
; якщо була помилка
lea dx, file_exists
call print
file_created:
Автор: bomzzz
Дата сообщения: 11.04.2012 20:01
во первых я не знаю на чем ты пишешь. тасм4 весит всего 350 кбайт, а код который туда вложен точно на нем компилируется. и для 16 бит, разницы ну никакой 4 или 5. разница будет если использовать опции ссe и ммх

Добавлено:
и кстати еще и совместим с эмуляторов 8086
Автор: A1exSun
Дата сообщения: 11.04.2012 20:02
bomzzz

Код: fn db "fio",0
...
mov ah, 5Bh
mov cx, 0 ; звичайний файл
lea dx, fn
int 21h
Автор: bomzzz
Дата сообщения: 11.04.2012 20:07
учись пользоваться отладкой и обработкой ошибок - вот и узнаешь
Автор: A1exSun
Дата сообщения: 11.04.2012 20:30

Цитата:
mov bh, filename+1

Вот ошибка, BL...
Автор: akaGM
Дата сообщения: 11.04.2012 21:24

Цитата:
да ладно...
Автор: A1exSun
Дата сообщения: 15.04.2012 14:22

Код: and sp, not 3 ; align stack to avoid AC fault
Автор: bomzzz
Дата сообщения: 15.04.2012 14:35
выравнивае с помощью команды align подразумевает, что блок памяти будет начинаться к адреса памяти кратному параметра команды. потому что память с начала блока читается лучше чем с серидины

от такое от
Автор: A1exSun
Дата сообщения: 15.04.2012 15:06
bomzzz

Цитата:
блок памяти будет начинаться к адреса памяти кратному параметра команды

Какой блок памяти и что за параметр команды?
Автор: bomzzz
Дата сообщения: 15.04.2012 15:31
память оперативная - планка. если нужно считать скажет 16 кбайт из памяти, то она быстрее считается если ее адрес будет кратен 16 - то есть она будет начинаться с какой то там внутренней ячейки, а если она будет начинаться например с 17 то дольше. надо к одному блоку получить доступ. потом перевести указатель на 1, потом ко второму и тд и тп
Автор: A1exSun
Дата сообщения: 15.04.2012 16:08
bomzzz
То есть начало программы будет располагаться по адресу кратному 16?
Автор: bomzzz
Дата сообщения: 15.04.2012 16:10
нет это для выравнивания блоков памяти внутри программы используеца. а начало программы и так с начала будет - потому что система так блок выделит.

Добавлено:
вот ты пишешь пишешь прохраму у тебя какой то критический блок для быстродействия, или дллка к которой будут потом обращаться разные программы а она в памяти сидеть, ты берешь точку входа или подпрограммы или дллки там выравниваешь.
да я сам особо не рублю как этим пользоваться. видел пару кодов с ним и делаю так же
Автор: bomzzz
Дата сообщения: 15.04.2012 20:10
как проверить наличие дискеты в флоповоде?
Автор: A1exSun
Дата сообщения: 15.04.2012 20:34
bomzzz
INT 13h функция 10h или 15h.
Автор: bomzzz
Дата сообщения: 15.04.2012 20:39
--- ----------------------------------------------------------------------------
0aH ¦AT¦ ¦XT¦ чтение длинное: 512 байт + 4-байтоый ECC (код коррекции ошибок).
вход: (как для подф. 02H)
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
ES:BX => в буфере (данные сектора + 4 байта) * число секторов (из AL)
--- ----------------------------------------------------------------------------

--- ----------------------------------------------------------------------------
0dH ¦AT¦ ¦XT¦ Альтернативный сброс устройства
вход: DL = диск
--- ----------------------------------------------------------------------------


Добавлено:
10H ¦AT¦ ¦XT¦ проверить готовность устройства
вход: DL = диск
выход: код ошибки диска (статус) в AH.

вот это наеврно - это готовность флоповода, но о наличии в нем дискеты ниче не говорит. при обращении к флоповоду дос говорит флоповод готов давай дискету, вот мне надо это сообщение давай дискету отключить и получить цифрой
Автор: A1exSun
Дата сообщения: 15.04.2012 20:52
15H ¦AT¦ читать тип диска (недоступна в XT BIOS)
вход: DL = диск
выход: AH = код устройства:
0 = устройство DL отсутствует
1 = дискета; логика замены диска отсутствует
2 = дискета; логика замены диска доступна (большинство случаев)
3 = твердый диск

А это?
Или можно первую дорожку считать. Считалась - диск есть.
Автор: bomzzz
Дата сообщения: 15.04.2012 20:56
да вот я думаб что если даже через инт 13 то дос разорется давай дискету. надо пробовать
Автор: A1exSun
Дата сообщения: 15.04.2012 21:05
http://www.codenet.ru/progr/dos/int_0027.php глянь это.
Автор: bomzzz
Дата сообщения: 15.04.2012 21:17
чета не фурыкаит
[more]
Добавлено:

Цитата:
Ошибки, возникающие в процессе INT 25H/26H, НЕ обрабатываются обработчиком кртических ошибок INT 24H .

в этом случае и не возникает ошибки перехватывать int24h я с самого начала пытался - не вызывается обработчик. это не ошибка, просто давай дискету. а так как это уже фугкции доса они точно вызовут подпрограмму которая дискету просют

Добавлено:
http://forum.ru-board.com/topic.cgi?forum=5&topic=32855&start=6260#13
вот зараза. вообщем вот тут полностью описано в чем проблема. просто программа не выдает ошибки потому что INT13h ччитает с отражения сектор

Добавлено:
переделал немного чтоб размер программы был меньше. может лучше конечно сжать ее было

Добавлено:
не фигня какая то, у меня и на винде ошибка не возращается, хотя нету не то что Б А тоже нету

Добавлено:
хахахахахахахаха. че ты малчиш я тут таких ашипак налепил

; ===============================================================
; ===============================================================
name NONAME
; ===============================================================
; === Начало программы: ===
CSEG segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h ; COM файл
; ===============================================================
Start:
LEA BX,BUFFER ;ES:BX приемник
MOV AH,2
MOV AL,1 ;число секторов
XOR CH,CH ;номер дорожки (цилиндра)(0-n)
MOV CL,1 ;сектор 2
MOV DX,0 ;DH=0 (головка 0), DL=1 (дисковод 1 B
INT 13h
JNC OK
MOV ERRLVL,1
OK:
MOV DX, offset BUFFER
MOV AH, 09h        ;
INT 21h        ;
MOV AH,4ch
MOV AL,ERRLVL
INT 21h
; ===============================================================
BUFFER    db 512 dup (?)
    db '$'
ERRLVL db 11
CSEG ends
end Start
; ===============================================================

Добавлено:
УРА!!!!!!!!! все получилось.

Добавлено:
пришлось попарица

Цитата:
; ===============================================================
; ===============================================================
name NONAME
; ===============================================================
; === Начало программы: ===
CSEG segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h ; COM файл
; ===============================================================
Start:
LEA BX, Finish
SHR BX,4
INC BX
MOV AH,4Ah
INT 21h        ;Ужимаем размер отведенной памяти до метки Finish
MOV AX, 4800h    ;выделим блок памяти под буфер чтения
MOV BX, 20h    ;512 байт 32 параграфов на 16 байт
INT 21h        ;ERROR_NOT_ENOUGH_MEMORY==8
JC NOMEM
MOV ES,AX
XOR BX,BX    ;ES:BX приемник
MOV AX,201h    ;число секторов
MOV CX,1    ;CH номер дорожки (цилиндра)(0-n); CL сектор 2
MOV DX,1    ;DH=0 (головка 0), DL=1 (дисковод 1 B
INT 13h
JNC OK
MOV ERRLVL,15h    ;ERROR_NOT_READY
OK:
MOV AH,49h    ;освободим блок выделенной памяти под буфер
INT 21h        ;в es параграф блока
MOV AL,ERRLVL
NOMEM:
MOV AH,4ch
INT 21h
; ===============================================================
ERRLVL    db 0
Finish    equ $
CSEG ends
end Start
; ===============================================================

[/more]

Цитата:
; ===============================================================
; ===============================================================
name NONAME
; ===============================================================
; === Начало программы: ===
CSEG segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h ; COM файл
; ===============================================================
Start:
LEA BX, Finish
MOV AX,201h    ;число секторов
MOV CX,1    ;CH номер дорожки (цилиндра)(0-n); CL сектор 1
MOV DX,1    ;DH=0 (головка 0), DL=1 (дисковод 1 B
INT 13h
JNC OK
MOV ERRLVL,15h    ;ERROR_NOT_READY
OK:
MOV AL,ERRLVL
MOV AH,4ch
INT 21h
; ===============================================================
ERRLVL    db 0
Finish    db '$';db 512 dup (0)
CSEG ends
end Start
; ===============================================================


ну я умудрылса пропустить mov ah, 2 и int13h - самая хлавное, а ты малчишь. тупил с головками забыл самое гланое
Автор: A1exSun
Дата сообщения: 16.04.2012 10:38
bomzzz
Да откуда я знаю

Добавлено:

Код: printCPUClock proc
pushad
mov ah, 9
lea dx, CPUClock_msg
int 21h
in al, 70h
or al, 80h
out 70h, al
mov al, 0FEh
out 21h, al
hlt
rdtsc
mov esi, eax
hlt
rdtsc
sub eax, esi
mov ebx, 1190000
mul ebx
mov ebx, 1000000
div ebx
mov edx, 0
mov ebx, 65535
div ebx
rol eax, 16
mov dx, ax
mov al, 0
out 21h, al
in al, 70h
and al, 7Fh
out 70h, al
shr eax, 16
mov bl, 4
call printDecimal
mov ah, 9
lea dx, MHz_msg
int 21h
popad
ret
printCPUClock endp
Автор: bomzzz
Дата сообщения: 16.04.2012 12:23
я специально для тебя усирался, все промежуточные коды положил чтоб ты мог посматреть

Цитата:
rdtsc

ну патамуша под виндой дос программы работают в режиме эммуляции реального режима в защищенам, а под досом в реальном режими.

http://rghost.ru/37608525
Кулаков. Программирование на аппаратном уровне.
http://rghost.ru/37608545
отличное пособие, этот кулаков преподает в вузе и покрайней мере думает своей головешкой, что объяснять людям надо так что они понимали. правда в книге есть много неточностей, так что лучше вооружится дополнительно справочником
Автор: A1exSun
Дата сообщения: 16.04.2012 15:39
bomzzz

Цитата:
я специально для тебя усирался, все промежуточные коды положил чтоб ты мог посматреть

Я с флоппи только в теории знаком, когда-то пытался на низком уровне КПДП программировать, запрограммировал, сдал и забыл


Цитата:
Кулаков. Программирование на аппаратном уровне.

Посмотрю, спасибо. На удивление, определяет четко.
Автор: bomzzz
Дата сообщения: 16.04.2012 15:48
хд гораздо сложнее читать чем флоппи тупить с этими головками. а это был простенький примерчик , где легко присобачился вывод на экран. как раз для тебя
Автор: A1exSun
Дата сообщения: 16.04.2012 15:56
Зачем тебе флоппи в 2012 году? Я вот недавно дискету еле еле достал.
Автор: MERCURY127
Дата сообщения: 16.04.2012 16:03
Все очень просто - работа с дискетой и пр динозаврами давно изучена, и хорошо описана всеми, кому было не лень. А вот работа с лба48 например, фиг описана, да и то только на ангельском.
Автор: doktorpilulkin
Дата сообщения: 16.04.2012 16:09
ой. а что это вы тут делаете?
Автор: bomzzz
Дата сообщения: 16.04.2012 16:12
почему у меня же практическая потребность была. широко использую это дело и ЭТО ПРИ ПОЛНОМ НАЛИЧИИ ОТСУТСВИЯ работающего флоповода на компьютере.
под виндой у меня виртуальный драйвер, под биосом - промапленные образы флоповодов грубом. никаких заморочек с буквами дисков ... ну вообще удобно
у меня предположительно конфликт материнка-видео карта флоповод не работает
http://s019.radikal.ru/i608/1204/46/8dda4f1bb289.gif
какая то фигня с отражением флоповода А на В. а за счет прямого чтения через биос различаются отражение и реально-виртуальный флоповоды

http://s2.ipicture.ru/uploads/20120416/ShB6ygUA.gif
http://s2.ipicture.ru/uploads/20120416/uAMGTTAp.png
Автор: Maksim_Avrorov
Дата сообщения: 20.04.2012 08:02
Всем доброго утра. Я написал(переписал) программу, но в ней не могу кое-чего уловить.
Код:
code segment
assume cs:code, ds:code
mov bx, 101001001b
mov cx, 16
lp1:    mov dl, '0'
     shl bx, 1
     jnc lp2
     add dl, 1
lp2:    mov ah, 2
     int 21h
     loop lp1
     mov ax, 4c00h
     int 21h
code ends
end
Как написано программа выводит значение BX в двоичном представлении. По сути я не могу понять только как команда сложения(add dl, 1) делает единицу.
Автор: bomzzz
Дата сообщения: 20.04.2012 08:11
тут использован такой алгоритм. команда shl смещает все биты влево, крайний левый бит вылазит в флаг CF (флаг переноса) команда jnc проверяет установлен он (вылезла единица) или нет (вылез) ноль.

Добавлено:

Цитата:
CSEG segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h
Start:
    xor    ax, ax
    in    al, 92h
    or    al, 02h
    out    92h, al
    in    al, 92h
    mov    bx, ax

    mov    cx, 15
print:
    mov    ah, 2
    xor    dx, dx
    bt    bx, cx
    adc    dl, 30h
    int    21h
    sub    cx, 1
    jnc    print

    mov    dl, 'b'
    int    21h

    mov    ah, 0
    int    16h

    ret
CSEG ends
end Start


вот еще один алгоритм, построен на команде BT и ADC, первая выдвигает указанный бит в флаг переноса, вторая складывает флаг переноса с числом. а проверяется тут кажется открыт ли вентиль A20

Добавлено:
http://ziplib.com/emu8086/
юзай эммулятор сразу все понятно станет, правда как биты крутятся он как раз не очень показывает
Автор: Maksim_Avrorov
Дата сообщения: 20.04.2012 12:32
Спасибо. Сейчас на эмуляторе попробую.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.