никто с XMS менеджерами никогда ниче не делал? чета у меня медленно обмен идет относительно с другими программами. может какой секрет есть
» Assembler
bomzzz, медленно в каком смысле? Сама пересылка данных, или что то другое?
Добавлено:
Секрет там один - для быстрой пересылки используется "нереальный режим" или LOADALL в самом XMM, это работает только в реальном режиме естественно. После перехода в защищенный режим, это уже не работает, и менеджер переходит к переключениям в/из реальный и обратно. Чем крупнее блок данных для пересылки, тем быстрее оно работает. Поэтому не стоит пересылать данные 1 кб страницами...
Добавлено:
Секрет там один - для быстрой пересылки используется "нереальный режим" или LOADALL в самом XMM, это работает только в реальном режиме естественно. После перехода в защищенный режим, это уже не работает, и менеджер переходит к переключениям в/из реальный и обратно. Чем крупнее блок данных для пересылки, тем быстрее оно работает. Поэтому не стоит пересылать данные 1 кб страницами...
LOADALL на пентиуме не работает.
пересылаю по 32 кбайта.
суть в следующем:
копирующая через XMS утилита копирует 1 гиговый файл за 47-48 секнуд (без поддержки больших файлов), копирующая без XMS памяти утилита копирует за 42-43 секунды 1 гиг. вторая утилита на копировании 1 гигового файлы в рам диск (который создан в этой самой XMS памяти) тратит 20 секунд а из рамдиска на диск 22-23 секунды.
то есть получается мое использование XMS памяти кривое, хотя где там можно что то принципиально изменить в упор не понятно
Добавлено:
PS дос команды copy и xcopy такой файл будут копировать минут 5-10
пересылаю по 32 кбайта.
суть в следующем:
копирующая через XMS утилита копирует 1 гиговый файл за 47-48 секнуд (без поддержки больших файлов), копирующая без XMS памяти утилита копирует за 42-43 секунды 1 гиг. вторая утилита на копировании 1 гигового файлы в рам диск (который создан в этой самой XMS памяти) тратит 20 секунд а из рамдиска на диск 22-23 секунды.
то есть получается мое использование XMS памяти кривое, хотя где там можно что то принципиально изменить в упор не понятно
Добавлено:
PS дос команды copy и xcopy такой файл будут копировать минут 5-10
Доброго всем утра, делаю шифратор/дешифратор(методом перестановки байтов).
Все скомпилировал. Но появилась проблема с чтением файла.
.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
С уважением Лев.
Все скомпилировал. Но появилась проблема с чтением файла.
.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
С уважением Лев.
то есть чтоб под досом при копировании большую нагрузку на винт не делать из за буфера в 32 кбайта, сделал буфер в 10 мб xms памяти, сначала 10 мб файла копируется туда а потом оттуда а получается медленнее
bomzzz
Цитата:
а если сложить числа?
Цитата:
вторая утилита на копировании 1 гигового файлы в рам диск (который создан в этой самой XMS памяти) тратит 20 секунд а из рамдиска на диск 22-23 секунды.
а если сложить числа?
ну я об етам и гавару, что если я сам использую память - получается 48 секунд, а если использую память рам диска 42 (20+22)
Добавлено:
а с расширеным флагом - большие размеры до 4 гиг вообще гавно получается, файл 3.3 гига копируется 5 минут
Добавлено:
а под использую память рам диска надо понимать, что вызывает 13 прерывание, его рамдиск перехватывает, совершенно не оптимальным как у меня (исходник есть) образом перемещает блоки и делает это быстрее. буфера менял .. ниче в голову не лезет
Добавлено:
а с расширеным флагом - большие размеры до 4 гиг вообще гавно получается, файл 3.3 гига копируется 5 минут
Добавлено:
а под использую память рам диска надо понимать, что вызывает 13 прерывание, его рамдиск перехватывает, совершенно не оптимальным как у меня (исходник есть) образом перемещает блоки и делает это быстрее. буфера менял .. ниче в голову не лезет
ну пачиму такая ж может получаться
по всякому код менял, выравнивал границу, выделял память, делал смещение по всякому. без памяти 42 сек, с памятью 47, в тоже время сначала на рамдиск потом из рамдиска 42 сек. куда эти пять секунд деются
по всякому код менял, выравнивал границу, выделял память, делал смещение по всякому. без памяти 42 сек, с памятью 47, в тоже время сначала на рамдиск потом из рамдиска 42 сек. куда эти пять секунд деются
немного не в этом причина была, удалось причину не найти а только выделить.
каким то чудесным образом самым неоптимальным образом практически с ошибками написал код - один любой байт меняешь начинает копировать на 5 сек медленнее. причем ниче не помогает, nop-ы вставляешь все равно. только так или никак
каким то чудесным образом самым неоптимальным образом практически с ошибками написал код - один любой байт меняешь начинает копировать на 5 сек медленнее. причем ниче не помогает, nop-ы вставляешь все равно. только так или никак
mov dh, [es:484h]
Зачем квадратные скобки, и без них работает ведь?
Зачем квадратные скобки, и без них работает ведь?
адрес значит
bomzzz
Но без них работает?
Но без них работает?
можно так, можно и не так, а можно и этак
нотация такая...
а есть такие случаи, в кот. только со скобками...
аналог
a = b * c + d
a = b * (c + d)
нотация такая...
а есть такие случаи, в кот. только со скобками...
аналог
a = b * c + d
a = b * (c + d)
как то обычно не до того чтоб проверять как работать будет. может один компилятор сожрет а другой нет
Добавлено:
32 битный масм обычно ругается если не написать что требуется байт слово или два слова. вот ему скобки будут нужны
Добавлено:
32 битный масм обычно ругается если не написать что требуется байт слово или два слова. вот ему скобки будут нужны
В общем, понял так, что в скобках располагается адрес. Если там имя переменной, то в ней должен быть адрес.
Перед выводом на экран слова из массива структур нужно проверять, поместиться ли оно полностью в текущей строке, если нет - выводить на следующей. Структура уже заполнена, слов там штук 60. Все заканчиваются знаком $.
Что лучше сделать, добавить в структуру запись о длине слова (+60 байт, время потраченное на подсчет и заполнение ручками), или перед выводом на экран, искать в слове знак $, таким образом определяя его длину? (походу медленнее производительность)
Что лучше сделать, добавить в структуру запись о длине слова (+60 байт, время потраченное на подсчет и заполнение ручками), или перед выводом на экран, искать в слове знак $, таким образом определяя его длину? (походу медленнее производительность)
Производительность меньше не станет, особенно если оптимизировать через скасб, но зато гибкость во втором случае больше
MERCURY127
Я и думал через SCASB делать Ты прав.
Добавлено:
Но все-таки посчитал и дописал ручками в таблицы... Расширятся они не будут.
Просто там все регистры заняты и пришлось бы еще ES переустанавливать на сегмент данных, да еще и хз как в DI занести конкретно нужное слово из таблицы.
В общем, работает
Я и думал через SCASB делать Ты прав.
Добавлено:
Но все-таки посчитал и дописал ручками в таблицы... Расширятся они не будут.
Просто там все регистры заняты и пришлось бы еще ES переустанавливать на сегмент данных, да еще и хз как в DI занести конкретно нужное слово из таблицы.
В общем, работает
Цитата:
как в 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
вот так примерно
С той лишь разницей что генерацию таблицы длин и начал можно поручить компилятору...
точно можно, через -$. написькай примерчик плиз. я как то этим $ никогда не пользовался
а наверно надо было дать каждой строке имя и отнять офсеты
Добавлено:
вообщем я просто прогу сляпал которая мне строку длин дала, осталось только ее переписать, получается неудобно потому что у меня в одной проге иногда массив меняется
а наверно надо было дать каждой строке имя и отнять офсеты
Добавлено:
вообщем я просто прогу сляпал которая мне строку длин дала, осталось только ее переписать, получается неудобно потому что у меня в одной проге иногда массив меняется
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)
Код: 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
Забыл, выше описана структура:
Код: feature_entry struc
feature_mask dd 0
feature_msg db 16 dup(0)
feature_entry ends
Забыл, выше описана структура:
Код: feature_entry struc
feature_mask dd 0
feature_msg db 16 dup(0)
feature_entry ends
а ну так лучше
Цитата:
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]
Добавлено:
не понятно как проверить. если просто писать и читать по этому адресу все конечно прочитается, но как понять что попал именно туда куда надо
а как директиву use16 use32 использовать в середине кода - вообще можно в середине кода перейти в 32 битный код, а потом вернуться?
пол ехе будет 32, а остальное 64...
что такое "перейти на код"?
что такое "перейти на код"?
ну чтоб часть кода компилятор компилировал как использующий 16 битную адресацию, а часть как 32 битную. не знаю как правельно сказать.
USE - директива
USE - директива
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
Предыдущая тема: .NET GUI компоненты
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.