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

» Assembler

Автор: bomzzz
Дата сообщения: 22.04.2012 09:53
никто с XMS менеджерами никогда ниче не делал? чета у меня медленно обмен идет относительно с другими программами. может какой секрет есть
Автор: MERCURY127
Дата сообщения: 22.04.2012 13:54
bomzzz, медленно в каком смысле? Сама пересылка данных, или что то другое?

Добавлено:
Секрет там один - для быстрой пересылки используется "нереальный режим" или LOADALL в самом XMM, это работает только в реальном режиме естественно. После перехода в защищенный режим, это уже не работает, и менеджер переходит к переключениям в/из реальный и обратно. Чем крупнее блок данных для пересылки, тем быстрее оно работает. Поэтому не стоит пересылать данные 1 кб страницами...
Автор: bomzzz
Дата сообщения: 22.04.2012 14:18
LOADALL на пентиуме не работает.


пересылаю по 32 кбайта.

суть в следующем:

копирующая через XMS утилита копирует 1 гиговый файл за 47-48 секнуд (без поддержки больших файлов), копирующая без XMS памяти утилита копирует за 42-43 секунды 1 гиг. вторая утилита на копировании 1 гигового файлы в рам диск (который создан в этой самой XMS памяти) тратит 20 секунд а из рамдиска на диск 22-23 секунды.

то есть получается мое использование XMS памяти кривое, хотя где там можно что то принципиально изменить в упор не понятно

Добавлено:
PS дос команды copy и xcopy такой файл будут копировать минут 5-10
Автор: wedl
Дата сообщения: 22.04.2012 14:24
Доброго всем утра, делаю шифратор/дешифратор(методом перестановки байтов).
Все скомпилировал. Но появилась проблема с чтением файла.


.model    small
.stack    100h    ;256 байт под стек
.data
;--------------------------------------------------------------------------
;Макрос: ввод строки в буффер
entbuff     macro     string
    mov    ah,0Ah
    lea    dx,string
    int    21h
endm
;--------------------------------------------------------------------------
;Макрос: вывод строки на экран
dispstr     macro     string
    mov    ah,9h
    lea    dx,string
    int    21h
endm
;--------------------------------------------------------------------------
;        Сообщения выдаваемые на экран
;--------------------------------------------------------------------------
msg1        db    'Vvedite imia ishodnogo faila $'    ; ввод имени исходного файла
msg2        db    'Vvedite imia faila dlia sohranenia $'     ; ввод имени нового файла
msg3        db    'Vvedite posledovatelnost perestanovok '
        num label byte
        db ' zifr (bez simvolov razdelitelei): $'    ; Ввод ключа
msg4        db    'Kodirovanie zaversheno$'    ; кодирование завершено
;сообщения об ошибках
OUTERR        db    'Oshibka pri otkritii faila$'        ; ошибка при открытии файла
REAERR        db    'Oshibka pri chtenii iz faila$'        ; ошибка при чтении из файла
CREAERR        db    'Oshibka sozdania faila$'        ; ошибка при создании файла
CLOERR        db    'Oshibka pri zakritii faila$'        ; ошибка при закрытии файла
WRERR        DB    'Oshibka pri zapisi v vail$'        ; ошибка при записи в файл
NUERR        db    'Oshibka pri vvode kluchevoi posledovatelnosti$' ; ошибка при вводе ключевой последовательности

;--------------------------------------------------------------------------
;     Список параметров для ввода имени входного файла
;--------------------------------------------------------------------------
inputfilepar    label    byte            
maxlenin    db    100            ; максимальная длина
actlenin    db    100            ; фактическая длина
inputf        db    100 dup (0)        ; область для хранения имени
;--------------------------------------------------------------------------
;     Список параметров для ввода имени выходного файла
;--------------------------------------------------------------------------
outputfilepar    label    byte            
maxlenout    db    100            ; максимальная длина
actlenout    db    100            ; фактическая длина
outputf        db    100 dup (0)        ; область для хранения имени
;--------------------------------------------------------------------------
;      Список параметров для ввода значения ключа
;--------------------------------------------------------------------------
bloc equ 8                ; константа размера блока кодирования
key_choose    label    byte            
nkeylen        db    bloc +1            ; максимальная длина
ankeylen    db    bloc +1            ; фактическая длина
nkey        db    bloc +1 dup (0)        ; область для хранения значения
;--------------------------------------------------------------------------

nbuf        db    bloc +1 dup (0)        ; область для хранения значения
;--------------------------------------------------------------------------


;              Дескрипторы фаилов
;--------------------------------------------------------------------------
handle1        dw    ?            ; дескриптор исходного файла
handle2        dw    ?            ; дескриптор нового файла
;--------------------------------------------------------------------------
;              Прочие данные
;--------------------------------------------------------------------------
ERRID     db     0            ; флаг ошибки
temp1        db    bloc +1 dup ('0')        ; для хранения блока данных


;--------------------------------------------------------------------------
;        Начало основного тела программы
;--------------------------------------------------------------------------
.code
start:
    mov    ax,@data    ; инициализация
    mov    ds,ax        ; сегментных
    mov    es,ax        ; регистров
    

    call    ENTERING    ; вызов процедуры ввода с клавиатуры
GO:    
    call    OPENF        ; вызов процедуры открытия файла
    cmp    ERRID,0        
    jnz    ProgEX
    call    KEY_NUMBER        ; ввод ключа
    cmp    ERRID,0
    jnz    ProgEX
    call    CREATEF        ; создание нового файла
    cmp    ERRID,0
    jnz    ProgEX
    call    KRYPT    ; запись нового файла
    cmp    ERRID,0    
    jnz    ProgEX
    call    CLOSEF        ; закрытие файлов
    cmp    ERRID,0
    jnz    ProgEX
    dispstr msg4        ; вывод конечного сообщения
ProgEX:
    mov    ah,8h        ; ожидание нажатия клавиши
    int    21h
    mov    ax,4C00h    ; завершение программы
    int    21h

;--------------------------------------------------------------------------
;        процедура ввода параметров
;--------------------------------------------------------------------------
ENTERING proc

    dispstr msg1        ; вывод сообщения об имени исходного файла    
    entbuff inputfilepar    ; ввод имени
    call    CH_STR
    mov    bl,actlenin
    mov    bh,00
    mov    inputf[bx],0    ; установка символа конца имени файла
    mov al,bloc
    add al,30h
    mov [num],al    
    dispstr    msg3        ; запрос на ввод числа изменения
    entbuff    key_choose    ; запоминаем ключ в символьном виде

    call    CH_STR
    dispstr msg2        ; запрос на ввод имени выходного фаила        
    entbuff    outputfilepar    ; ввод имени
    call    CH_STR
    mov    bl,actlenout
    mov    bh,00    
    mov    outputf[bx],0    ; установка символа конца имени файла
    ret
ENTERING endp

;--------------------------------------------------------------------------
;             процедура открытия файла
;--------------------------------------------------------------------------

OPENF    proc    

    mov    ah,3Dh
    mov    al,00
    lea    dx,inputf
    int    21h        ; открытие файла
    jc    OPER        ; переход в случае ошибки
    mov    handle1,ax    ; запоминание дескриптора файла
    jmp    OPEN
OPER:    
    dispstr    OUTERR        ; вывод сообщения об ошибке
    mov    ERRID,01    ; запись факта ошибки
OPEN:
    ret
OPENF    endp

;--------------------------------------------------------------------------
;         процедура перехода на следующую строку
;--------------------------------------------------------------------------

CH_STR    proc    
    mov     ah, 02h
    mov     dl, 0Ah
    int     21h        ; переход на следующую строку
    mov     ah, 02h
    mov     dl, 0Dh
    int     21h        ; возврат каретки
    ret
CH_STR    endp

;--------------------------------------------------------------------------
;         процедура перевода сканкода ключа в числ0
;--------------------------------------------------------------------------

KEY_NUMBER    proc
    xor    cx,cx        ; зануление счетчика         
    mov    cl,ankeylen    ; загружаем длину строки    
    xor    ax,ax        ; обнуляем регистры ax и dx
    lea    si,nkey        ; загружаем адрес начала символов значения
    lea di,nkey
Trans:
    lodsb            ; загружаем символ в al
    sub    al,49        ; перводим в число    
    jc    KEYERR    
    cmp    al,7     ; дальность пермещения не может быть больше чем (рзмер блока - 1)
    ja    KEYERR
    stosb     ; загружаем переведенные числа опять в ту же стороку
    loop    Trans        
    jmp    KEYEX    
KEYERR:
    call    CH_STR        ; перевод строки
    dispstr NUERR        ; сообщение об ошибке
    mov    ERRID,01        ; запись факта ошибки
    jmp    KEYEX
KEYEX:
    ret
KEY_NUMBER    endp


;--------------------------------------------------------------------------
;             процедура создания файла
;--------------------------------------------------------------------------

CREATEF    proc    
                
    lea    si,inputf    ; сравниваем имена входного и выходного файлов
    lea    di,outputf
    xor    cx,cx
    mov    cl,80
    cld
    repe    cmpsb        ; посимвольная проверка имен фаилов
    jz    CКER        ; если одинаковые - ошибка
CR:
    mov    ah,5Bh        
    mov    cx,00
    lea    dx,outputf
    int    21h        ; создаем новый файл
    jc    CКER        ; переход, если произошла ошибка создания или фаил с таким именем существует
    mov    handle2,ax    ; сохраняем дескриптор файла
    jmp    CREATE
CКER:    
    dispstr CREAERR        ; сообщение об ошибке
    mov    ERRID,01    ; запись факта ошибки
CREATE:
    ret
CREATEF    endp

;--------------------------------------------------------------------------
;             процедура закрытия файла
;--------------------------------------------------------------------------
CLOSEF    proc    
    mov    ah,3Eh
    mov    bx,handle1    ; загружаем дескриптор
    int    21h        ; закрываем файл
    mov    bx,handle2    ; загружаем дескриптор
    int    21h        ; закрываем файл
    jc    CLOUTERR
    jmp    CLOSE1
CLOUTERR:
    dispstr CLOERR        ; сообщение об ошибке
    mov    ERRID,01    ; запись факта ошибки    
CLOSE1:
    ret
CLOSEF    endp


;--------------------------------------------------------------------------
; процедура кодирования
;--------------------------------------------------------------------------

KRYPT    proc
begwrite:
    mov    ah,3Fh        
    mov    bx,handle1    ; Файловый номер
    mov    cx,bloc    ; считываем bloc байт в память
    lea    dx,temp1
    int    21h        ; считываем значения в память, начиная со смещения temp1
    jc    KRYPTERR
    cmp    ax,0        ; проверяем сколько байт считано
    je    endwr        ; если 0, то файл закончился
    push     ax

    cmp    ax,bloc        ; проверяем сколько байт считано
    jb    ewr        ; если <bloc, то не кодируем

    mov     cx, bloc
    lea    di,temp1    ; загружаем в di адрес начала блока данных
    lea    si,nkey        ; загружаем адрес начала ключа
    lea    bx,nbuf
    
changing:
    mov    al,[di]        ; заносим в al текущийц байт данных
    mov    ah,[si]        ; помещаем текущее значение ключа
    push     bx
    push     ax
    mov     al,ah
    xor     ah,ah
    add     bx,ax
    pop     ax
    mov     [bx],al        ;помещаем текучий байта в байт из буфера с номером взятым из ключа
    pop     bx
    inc     di
    inc     si
;курсач гори в аду
    loop    changing

    
    mov    ah,40h
    mov    bx,handle2    ; загружаем дескриптор нового файла
    pop     cx        ; записываем число обработанных байтов в счетчик    
    lea    dx,nbuf
    int    21h        ; переписываем в новый файл
    jc    WRIERR
    jmp    begwrite

ewr:
    mov    ah,40h
    mov    bx,handle2    ; загружаем дескриптор нового файла
    pop    cx        ; записываем число обработанных байтов в счетчик    
    lea    dx,temp1
    int    21h        ; переписываем в новый файл
    jc    WRIERR
    jmp    begwrite

KRYPTERR:
    dispstr REAERR        ; сообщение об ошибке
    mov    ERRID,01    ; запись факта ошибки
    jmp endwr
WRIERR:
    dispstr WRERR        ; сообщение об ошибке
    mov    ERRID,01    ; запись факта ошибки
endwr:
    ret    
KRYPT    endp


end start

С уважением Лев.
Автор: bomzzz
Дата сообщения: 22.04.2012 14:27
то есть чтоб под досом при копировании большую нагрузку на винт не делать из за буфера в 32 кбайта, сделал буфер в 10 мб xms памяти, сначала 10 мб файла копируется туда а потом оттуда а получается медленнее
Автор: MERCURY127
Дата сообщения: 22.04.2012 15:05
bomzzz

Цитата:
вторая утилита на копировании 1 гигового файлы в рам диск (который создан в этой самой XMS памяти) тратит 20 секунд а из рамдиска на диск 22-23 секунды.

а если сложить числа?
Автор: bomzzz
Дата сообщения: 22.04.2012 15:07
ну я об етам и гавару, что если я сам использую память - получается 48 секунд, а если использую память рам диска 42 (20+22)

Добавлено:
а с расширеным флагом - большие размеры до 4 гиг вообще гавно получается, файл 3.3 гига копируется 5 минут

Добавлено:
а под использую память рам диска надо понимать, что вызывает 13 прерывание, его рамдиск перехватывает, совершенно не оптимальным как у меня (исходник есть) образом перемещает блоки и делает это быстрее. буфера менял .. ниче в голову не лезет
Автор: bomzzz
Дата сообщения: 22.04.2012 18:03
ну пачиму такая ж может получаться

по всякому код менял, выравнивал границу, выделял память, делал смещение по всякому. без памяти 42 сек, с памятью 47, в тоже время сначала на рамдиск потом из рамдиска 42 сек. куда эти пять секунд деются
Автор: bomzzz
Дата сообщения: 24.04.2012 01:09
немного не в этом причина была, удалось причину не найти а только выделить.
каким то чудесным образом самым неоптимальным образом практически с ошибками написал код - один любой байт меняешь начинает копировать на 5 сек медленнее. причем ниче не помогает, nop-ы вставляешь все равно. только так или никак
Автор: A1exSun
Дата сообщения: 24.04.2012 18:29
mov dh, [es:484h]
Зачем квадратные скобки, и без них работает ведь?
Автор: bomzzz
Дата сообщения: 24.04.2012 18:31
адрес значит
Автор: A1exSun
Дата сообщения: 24.04.2012 18:32
bomzzz
Но без них работает?
Автор: akaGM
Дата сообщения: 24.04.2012 18:34
можно так, можно и не так, а можно и этак
нотация такая...
а есть такие случаи, в кот. только со скобками...
аналог

a = b * c + d
a = b * (c + d)
Автор: bomzzz
Дата сообщения: 24.04.2012 18:35
как то обычно не до того чтоб проверять как работать будет. может один компилятор сожрет а другой нет

Добавлено:
32 битный масм обычно ругается если не написать что требуется байт слово или два слова. вот ему скобки будут нужны
Автор: A1exSun
Дата сообщения: 24.04.2012 18:47
В общем, понял так, что в скобках располагается адрес. Если там имя переменной, то в ней должен быть адрес.
Автор: A1exSun
Дата сообщения: 24.04.2012 20:53
Перед выводом на экран слова из массива структур нужно проверять, поместиться ли оно полностью в текущей строке, если нет - выводить на следующей. Структура уже заполнена, слов там штук 60. Все заканчиваются знаком $.
Что лучше сделать, добавить в структуру запись о длине слова (+60 байт, время потраченное на подсчет и заполнение ручками), или перед выводом на экран, искать в слове знак $, таким образом определяя его длину? (походу медленнее производительность)
Автор: MERCURY127
Дата сообщения: 24.04.2012 21:47
Производительность меньше не станет, особенно если оптимизировать через скасб, но зато гибкость во втором случае больше
Автор: A1exSun
Дата сообщения: 24.04.2012 21:58
MERCURY127
Я и думал через SCASB делать Ты прав.

Добавлено:
Но все-таки посчитал и дописал ручками в таблицы... Расширятся они не будут.
Просто там все регистры заняты и пришлось бы еще ES переустанавливать на сегмент данных, да еще и хз как в DI занести конкретно нужное слово из таблицы.
В общем, работает
Автор: bomzzz
Дата сообщения: 25.04.2012 01:33

Цитата:
как в DI занести конкретно нужное слово из таблицы.


Цитата:
Mtype    db 'Format is unknown',0
    db 'A5.25" floppy, with 1.2MB and 512 bytes/sector.',0
    db 'A3.5" floppy, with 1.44MB and 512 bytes/sector.',0
    db 'A3.5" floppy, with 2.88MB and 512 bytes/sector.',0
    db 'A3.5" floppy, with 20.8MB and 512 bytes/sector.',0
    db 'A3.5" floppy, with 720KB and 512 bytes/sector.',0
    db 'A5.25" floppy, with 360KB and 512 bytes/sector.',0
    db 'A5.25" floppy, with 320KB and 512 bytes/sector.',0
    db 'A5.25" floppy, with 320KB and 1024 bytes/sector.',0
    db 'A5.25" floppy, with 180KB and 512 bytes/sector.',0
    db 'A5.25" floppy, with 160KB and 512 bytes/sector.',0
    db 'Removable media other than floppy.',0
    db 'Fixed hard disk media.',0
    db 'A3.5" floppy, with 120MB and 512 bytes/sector.',0
    db 'A3.5" floppy, with 640KB and 512 bytes/sector.',0
    db 'A5.25" floppy, with 640KB and 512 bytes/sector.',0
    db 'A5.25" floppy, with 720KB and 512 bytes/sector.',0
    db 'A3.5" floppy, with 1.2MB and 512 bytes/sector.',0
    db 'A3.5" floppy, with 1.23MB and 1024 bytes/sector.',0
    db 'A5.25" floppy, with 1.23MB and 1024 bytes/sector.',0
    db 'A3.5" floppy, with 128MB and 512 bytes/sector.',0
    db 'A3.5" floppy, with 230MB and 512 bytes/sector.',0
    db 'An 8" floppy, with 256KB and 128 bytes/sector.',0
    db 'A3.5" floppy, with 200MB and 512 bytes/sector. (HiFD).',0
    db 'A3.5" floppy, with 240MB and 512 bytes/sector. (HiFD).',0
    db 'A3.5" floppy, with 32MB and 512 bytes/sector.',0
baza    dw 0,18,66,114,162,210,257,305,353,402,450,498,533,556,603,650,698,746,793,842,892,939,986,1033,1088,1143,1189

вот так примерно
Автор: MERCURY127
Дата сообщения: 25.04.2012 08:01
С той лишь разницей что генерацию таблицы длин и начал можно поручить компилятору...
Автор: bomzzz
Дата сообщения: 25.04.2012 08:04
точно можно, через -$. написькай примерчик плиз. я как то этим $ никогда не пользовался
а наверно надо было дать каждой строке имя и отнять офсеты

Добавлено:
вообщем я просто прогу сляпал которая мне строку длин дала, осталось только ее переписать, получается неудобно потому что у меня в одной проге иногда массив меняется
Автор: A1exSun
Дата сообщения: 25.04.2012 09:46
bomzzz

Код: feature_1_ecx_table label
feature_entry <00000001h, "SSE3$"> ; [0]
feature_entry <00000002h, "PCLMULQDQ$"> ; [1]
feature_entry <00000004h, "DTES64$"> ; [2]
feature_entry <00000008h, "MONITOR$"> ; [3]
feature_entry <00000010h, "DS-CPL$"> ; [4]
feature_entry <00000020h, "VMX$"> ; [5]
feature_entry <00000040h, "SMX$"> ; [6]
feature_entry <00000080h, "EIST$"> ; [7]
feature_entry <00000100h, "TM2$"> ; [8]
feature_entry <00000200h, "SSSE3$"> ; [9]
feature_entry <00000400h, "CNXT-ID$"> ; [10]
feature_entry <00001000h, "FMA$"> ; [12]
feature_entry <00002000h, "CMPXCHG16B$"> ; [13]
feature_entry <00004000h, "XTPR$"> ; [14]
feature_entry <00008000h, "PDCM$"> ; [15]
feature_entry <00020000h, "PCID$"> ; [17]
feature_entry <00040000h, "DCA$"> ; [18]
feature_entry <00080000h, "SSE4.1$"> ; [19]
feature_entry <00100000h, "SSE4.2$"> ; [20]
feature_entry <00200000h, "x2APIC$"> ; [21]
feature_entry <00400000h, "MOVBE$"> ; [22]
feature_entry <00800000h, "POPCNT$"> ; [23]
feature_entry <01000000h, "TSC-DEADLINE$"> ; [24]
feature_entry <02000000h, "AES$"> ; [25]
feature_entry <04000000h, "XSAVE$"> ; [26]
feature_entry <08000000h, "OSXSAVE$"> ; [27]
feature_entry <10000000h, "AVX$"> ; [28]
feature_1_ecx_table_count = ($ - offset feature_1_ecx_table) / (size feature_entry)
Автор: bomzzz
Дата сообщения: 25.04.2012 10:10
ни фига не понял, это для какого ассемблера?
Автор: MERCURY127
Дата сообщения: 25.04.2012 10:31
Масм/Тасм
Автор: A1exSun
Дата сообщения: 25.04.2012 10:42
bomzzz
Забыл, выше описана структура:

Код: feature_entry struc
feature_mask dd 0
feature_msg db 16 dup(0)
feature_entry ends
Автор: bomzzz
Дата сообщения: 25.04.2012 10:50
а ну так лучше
Автор: bomzzz
Дата сообщения: 26.04.2012 13:54

Цитата:
DX:BX = 32-bit physical address of the locked block

This function locks an extended memory block and returns
its base address as a 32-bit physical address. Locked memory blocks
are guaranteed not to move. The 32-bit pointer is only valid while
the block is locked. Locked blocks should be unlocked as soon as
possible.


подскажите как это будет. вот так?
mov ax, dx
shl eax, 16
mov ax, bx

[eax]

и второе:
mov word ptr[address], dx
mov word ptr[address+2],bx
mov eax, dword ptr [address]

[eax]

Добавлено:
не понятно как проверить. если просто писать и читать по этому адресу все конечно прочитается, но как понять что попал именно туда куда надо
Автор: bomzzz
Дата сообщения: 27.04.2012 18:18
а как директиву use16 use32 использовать в середине кода - вообще можно в середине кода перейти в 32 битный код, а потом вернуться?
Автор: akaGM
Дата сообщения: 27.04.2012 18:47
пол ехе будет 32, а остальное 64...
что такое "перейти на код"?
Автор: bomzzz
Дата сообщения: 27.04.2012 18:53
ну чтоб часть кода компилятор компилировал как использующий 16 битную адресацию, а часть как 32 битную. не знаю как правельно сказать.
USE - директива

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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