Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 375
от 18.02.2006, 16:24

Администратор:Калашников О.А.
В рассылке:Подписчиков: 259, Экспертов: 23
В номере:Вопросов: 4, Ответов: 7


Вопрос № 35276: Помогите разобраться в общем алгоритме работы, я что-то не улавливаю (bl=1A). 00401310 |> 803E 00 |CMP BYTE PTR DS:[ESI],0 {Сравнение первого символа с нулём 00401313 |. 74 15 |JE SHORT crackme#.0040132A {Прыгаем из процедуры, если первый ...
Вопрос № 35286: Здравствуйте! Пожалуйста, мне нужен исходник(в нем должно быть самое необходимое) на Ассемблере, как сложить два числа в десятичной системе и вывести на экран результат сложения (От начала да конца, с шапкой). Дело в том, что я почти уже понял Ас...
Вопрос № 35299: Здравствуйте уважаемые эксперты. Мне нужно открыть текстовый файл, прочитать его и поменять значение всех символов. Я действовал так: Open_file: mov ax,3D02h ;открываем mov dx,80h+1Eh ;смещение DTA+смещение имени файла int 21h ; ...
Вопрос № 35341: Есть программа которая копирует данные из одного файла в другой Вопрос: 1.как сделать чтобы при записи к каждому символу(ascii коду) добавлялось число. Метод типа: читать первый символ в буфер, добавлять число и записывать в другой, не по...

Вопрос № 35.276
Помогите разобраться в общем алгоритме работы, я что-то не улавливаю (bl=1A).
00401310 |> 803E 00 |CMP BYTE PTR DS:[ESI],0 {Сравнение первого символа с нулём
00401313 |. 74 15 |JE SHORT crackme#.0040132A {Прыгаем из процедуры, если первый сивол - 0
00401315 |. 8A06 |MOV AL,BYTE PTR DS:[ESI] {В AL присваивается первый символ
00401317 |. 02C1 |ADD AL,CL {Складываются AL и CL
00401319 |. 32C1 |XOR AL,CL ---
0040131B |. F6F3 |DIV BL ---
0040131D |. 66:C1E8 08 |SHR AX,8 ---
00401321 |. 04 41 |ADD AL,41 {В AL прибавляется 41
00401323 |. 8807 |MOV BYTE PTR DS:[EDI],AL {Результат (символ) заносится в AL
00401325 |. 47 |INC EDI {-Подготавливаем
00401326 |. 46 |INC ESI {- приёмник и счётчик
00401327 |. 41 |INC ECX {- для следующих символов
00401328 |.^EB E6 |JMP SHORT crackme#.00401310 {Прыгаем на начало процедуры генерации
Отправлен: 12.02.2006, 19:29
Вопрос задал: Meganop (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: EPDSota
Здравствуйте, Meganop!

Простейший алгоритм (необратимый)...
Эта функция преобразует оканичивающуюся нулем строку символов в строку целиком состоящую из больших латинских букв.

Его можно заменить спростым выбором сиволов из таблицы.

Так как вариантов входных символов 255 (256-1 (нулевой символ - признак конца строки) ), а на выходе - только 26 вариантов каждого символа.
То каждый символ на выходе на входе имеет 255/26 или 9-10 вариантов входных символов. вероятность угадывания строки на входе для получения нужной строки на выходе равна 26 в степени количество символов в выходной(входной) строке.

Приложение:

---------
Открыть глаза навстречу солнцу

Ответ отправил: EPDSota (статус: Практикант)
Отправлен: 17.02.2006, 10:33


Вопрос № 35.286
Здравствуйте!
Пожалуйста, мне нужен исходник(в нем должно быть самое необходимое) на Ассемблере, как сложить два числа в десятичной системе и вывести на экран результат сложения (От начала да конца, с шапкой). Дело в том, что я почти уже понял Ассемблер как язык. Осталось мелкие технические подробности на типо этой, и можно будет вплотную приступить к практике.
Хочу сказать, что этим Вы мне не сделаете поблажку, как "ленивому студенту", просто я ведь учу язык, а не создаю его, все таки, пожалуйста, помогите!!!
Отправлен: 12.02.2006, 21:01
Вопрос задал: Retcom (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Boriss
Здравствуйте, Retcom!
Вот писал я как-то пример почти по Вашему запросу: ввод десятичного числа (здесь преполагается только положительное число) и вывод суммы. Посмотрите прикрепленный файл

Прикреплённый файл: Загрузить >>
Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.
---------
Вывод - то место в тексте, где вы устали думать

Ответ отправил: Boriss (статус: Профессор)
Отправлен: 13.02.2006, 12:33
Оценка за ответ: 4
Комментарий оценки:
Ввожу:
masm proga.asm
Результат:
proga.asm(35):error A2005:symbol redefinition:@@1
proga.asm(71):error A2005:symbol redefinition:@@1


Вопрос № 35.299
Здравствуйте уважаемые эксперты. Мне нужно открыть текстовый файл,
прочитать его и поменять значение всех символов. Я действовал так:
Open_file:
mov ax,3D02h ;открываем
mov dx,80h+1Eh ;смещение DTA+смещение имени файла
int 21h ;
jc Error_file ;если не открылся - ошибка

mov bx,ax ;идентификатор файла
mov cx,1 ;читаем 1 байт
mov dx,offset buffer ;в буфер

Read_file:
mov ah,3Fh ;чтение файла
int 21h
jc Error_file

mov si,byte ptr buffer ;первый символ
shr si ;меняем его значение
mov byte ptr buffer,si ;и заносим обратно в буфер

mov ax,4201h ;перемещаем указатель файла назад на 1
dec cx
dec cx
mov dx,cx ;DX = 0FFFFh
int 21h
mov ah,40h ;записать в файл
inc cx
inc cx ;1 байт
mov dx,offset buffer ;из буфера
int 21h
jmp short Read_file

Tasm5.0 выдает ошибку. Подскажите пожалуйста, что я делаю не так.
Отправлен: 13.02.2006, 00:37
Вопрос задал: Gogenot (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Беляев Валерий (ака seaman)
Здравствуйте, Gogenot!
Используй вместо si, например bl:
mov bl, byte ptr buffer ;первый символ
shr bl, 1 ;меняем его значение
mov byte ptr buffer, bl ;и заносим обратно в буфер

si-принципиально бвубайтный регистр. Чтобы в него занести один байт надо использовать movzx.
Еще посоветовал бы читать/писать не побайтно, а хотя бы посекторно.
Ответ отправил: Беляев Валерий (ака seaman) (статус: 3-ий класс)
Отправлен: 13.02.2006, 08:21
Оценка за ответ: 5

Отвечает: Евгений Иванов
Здравствуйте, Gogenot!
Во первых:

    mov al,byte ptr buffer ;первый символ
    shr al, 1 ;меняем его значение
    mov byte ptr buffer,al ;и заносим обратно в буфер


Во вторых, не советовал бы использовать CX между вызовами INT 21h. Содержимое запросто может портиться. Используй SI, DI или местные переменные в стеке.

Удачи!

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 13.02.2006, 08:57
Оценка за ответ: 5


Вопрос № 35.341
Есть программа которая копирует данные из одного файла в другой
Вопрос:
1.как сделать чтобы при записи к каждому символу(ascii коду) добавлялось число.
Метод типа: читать первый символ в буфер, добавлять число и записывать в другой, не подходит.
2.вопрос связан с первым, после того как текст был загружен в буфер (buffer) можно обрашаться непосредственно к каждому символу.
add byte ptr buffer[1],2
как сделать цикл:
mov i,0
cikl:
inc i
add byte ptr buffer[i],2
jc exit
jmp cikl
данный пример не правельный, компилятор пишет что i константа
Вобшем подскажите что делать!

Приложение:

Отправлен: 13.02.2006, 15:02
Вопрос задал: Gwest (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Boriss
Здравствуйте, Gwest!
Это называется косвенной адрессацией. Для этого нужно использовать регистры, но не все можно. Используйте BX, SI или DI.
.model tiny
.code
org 100h
start:
xor BX, BX
mov CX, 8
cikl:
add byte ptr buffer[bx], 2
inc bx
LOOP cikl
ret
buffer db 1,2,3,,4,5,6,7,8,9,10
end start
---------
Вывод - то место в тексте, где вы устали думать
Ответ отправил: Boriss (статус: Профессор)
Отправлен: 13.02.2006, 15:57
Оценка за ответ: 5

Отвечает: PRiSon
Здравствуйте, Gwest!
1. А что может быть проще....или вам нужен алгоритм с наворотами??
2.Попробуй вот так:
mov si,i
mov bx,offset buffer
cikl:
inc si
add byte ptr ds:[bx+si],2
jc exit
jmp cikl
советую использовать не переменные а Регистры так проц быстрее сооброжает..

Приложение:

---------
Стремление-значит получится.

Ответ отправил: PRiSon (статус: 2-ой класс)
Отправлен: 13.02.2006, 16:01
Оценка за ответ: 5

Отвечает: Евгений Иванов
Здравствуйте, Gwest!
Я бы посоветовал выделить буфер не один байт размером, а побольше, допустим, 64 Кб (или 512 Кб в win32).
Потом обрабатываешь буфер и выгружаешь его в выходной файл.

Используй косвенную адресацию.
    sub ecx, ecx
    mov esi, offset buffer
    cikl:
    inc ecx
    add byte ptr [esi+ecx], 2
    jc exit
    jmp cikl


при работе с 4 байтовыми элементами вот так вот:
    sub ecx, ecx
    mov esi, offset buffer
    cikl:
    inc ecx
    add dword ptr [esi+ecx*4], 2
    jc exit
    jmp cikl


всего хорошего.
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 13.02.2006, 17:16
Оценка за ответ: 5
Комментарий оценки:
Хм... вот только я думал что ecx только под wind'у


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.14 (бета) от 09.02.2006
Яндекс Rambler's Top100

В избранное