Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 12.03.2018, 22:41   #11
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
Репутация: 25
По умолчанию

Методичек нет, учебников нет, нам в МГУ сказали, вот вам задание, развлекайтесь сами. Это под windows.
Danddz вне форума   Ответить с цитированием
Старый 12.03.2018, 23:27   #12
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
Репутация: 25
По умолчанию

R71MT, можно Вас попросить написать мне этот алгоритм, если вам не тяжело, а то у меня голова вообще уже не соображает от такого количества информации, а до сдачи все меньше времени. Я не хочу Вас напрягать.
Danddz вне форума   Ответить с цитированием
Старый 13.03.2018, 00:56   #13
R71MT
Профессионал
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,137
Репутация: 938
По умолчанию

..а чё так поздно спохватился-то, если завтра сдавать???
сейчас набросаю (только на FASM'e), а что получится - допилишь сам
__________________
Нашедшего выход - затаптывают первым..
R71MT вне форума   Ответить с цитированием
Старый 13.03.2018, 09:12   #14
R71MT
Профессионал
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,137
Репутация: 938
По умолчанию

вот тебе готовый код, только на FASM'e. разбирайся...
(лучше это, чем ничего):
Код:

; fasm-code
; хэндлы 'GetStdHandle' по умолчанию = stdOut(7), stdIn(3)
;-----------
; Считать две строки!
; В длиной строке меняем все/строчные на (N mod 10), где N = № буквы,
; а в короткой - после последнего 'a', все на '*'.
;----------------------------------------------------------------
format    PE  Console 4.0
include  'win32ax.inc'
entry     start

section   '.data' data readable writeable

mes1      db   'String(1):  '   ; строки диалога..
mes2      db   'String(2):  '   ;   ...
mes3      db   'Result...:  '   ;     ...
len       dd   $ - mes3         ; длина у всех одинакова
crlf      db   13,10            ; перевод строки!

buff1     db   100 dup(0)       ; буфер для строки(1) max = 100 символов.
buff2     db   100 dup(0)       ; буфер для строки(2)
size1     dd   0                ; реальная длина ввода(1)
size2     dd   0                ; реальная длина ввода(2)
bigStr    dd   0,0              ; dword(0)= размер, dword(1)= адрес
smallStr  dd   0,0              ; ^^^^^

section   '.code' code readable executable
start:
;------ Запрос и вводим строки
        invoke   WriteConsoleA, 7, mes1, [len], 0,0     ; запрос на ввод(1)
        invoke   ReadConsoleA, 3, buff1, 100, size1,0   ; макс.100 в буфер(1)

        invoke   WriteConsoleA, 7, mes2, [len], 0,0     ;
        invoke   ReadConsoleA, 3, buff2, 100, size2,0   ;

;------ Сравниваем размеры введённых строк
; В первых dword'ax big/smallSdtr будут размеры строк, во-вторых - их адреса
        push     buff1 [size1]    ; запомним последовательность в стеке
        push     buff2 [size2]    ; ^^^^
        mov      eax,[size1]      ; сравнить размеры строк
        cmp      eax,[size2]      ;
        jb       @small           ; если первая меньше второй

        pop      [smallStr] [smallStr+4]   ; снимаем в переменные со-стека
        pop      [bigStr]   [bigStr+4]     ;   ...в нужном порядке.
        jmp      @big                      ;

@small: pop      [bigStr]   [bigStr+4]     ;
        pop      [smallStr] [smallStr+4]   ;

;------ Обработка длинной строки (меняем все/строчные на (N mod 10))
@big:   mov      ecx,[bigStr]     ; ECX = длина строки (цикл)
        mov      esi,[bigStr+4]   ; ESI = её адрес для стр.инструкций 'LODSB'
        mov      edi,esi          ; EDI = он-же приёмник для записи 'STOSB'
        xor      ebx,ebx          ; EBX = позиция в строке для 'mod 10'
@cyc1:  lodsb                     ; AL = очередной символ из ESI
        inc      bl               ; считаем позицию...
        cmp      al,'a'           ; фильтр строчных
        jb       @next1           ;    ...
        cmp      al,'z'           ;
        ja       @next1           ; если не в диапазоне
        mov      al,bl            ; иначе: AAM = AL/10 (AH-целое, AL-остаток)
        aam                       ; AL = BL mod 10
@next1: stosb                     ; запись AL в ES:EDI
        loop     @cyc1            ; промотать СХ-раз...

;------ Обработка короткой строки (после последнего 'a', все на '*')
        mov      ecx,[smallStr]   ; ECX = длина короткой строки (цикл)
        dec      cx
        push     ecx              ;   ...(запомнить)
        mov      edi,[smallStr+4] ; EDI = её адрес для 'SCASB'
        add      edi,ecx          ; смещаемся в конец строки
        mov      al,'a'           ; AL = что искать!
        std                       ; ставим обратный шаг (Set-Direction-Flag)
@cyc2:  repne    scasb            ; ПОИСК (с конца строки, справо/налево)....
        cld                       ; опять прямой шаг (Clear-Direction)
        pop      eax              ; иначе: EAX = длинна всей строки
        or       ecx,ecx          ; нашли букву 'a' ???
        jz       @stop            ; нет!

        xchg     ecx,eax          ; иначе: поменять операнды
        sub      ecx,eax          ; вычисляем длинну хвоста
        add      edi,2            ; EDI (позиция) уже установлена на -2, на место её
        mov      al,'*'           ; что записать
        rep      stosb            ; заполняем хвост после 'a', значение AL!!!

;------ Вывод результата из буфера
@stop:  invoke   WriteConsoleA, 7, mes3, [len],   0,0
        invoke   WriteConsoleA, 7, buff1,[size1], 0,0
        invoke   WriteConsoleA, 7, crlf,2,0,0          ; перевод строки
        invoke   WriteConsoleA, 7, mes3, [len],   0,0
        invoke   WriteConsoleA, 7, buff2,[size2], 0,0

        jmp      $                ; (!) для теста! закомментировать
@exit:  invoke  ExitProcess, 0    ; на выход!

;------ Импорт API -----------------------------//
section '.idata' import data readable writeable
library  kernel32,'KERNEL32.DLL',\
         user32,  'USER32.DLL'
         include  'api\kernel32.inc'
         include  'api\user32.inc'

__________________
Нашедшего выход - затаптывают первым..
R71MT вне форума   Ответить с цитированием
Старый 13.03.2018, 12:55   #15
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
Репутация: 25
По умолчанию

Спасибо большое, поразвлекаюсь.
Danddz вне форума   Ответить с цитированием
Старый 13.03.2018, 13:07   #16
R71MT
Профессионал
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,137
Репутация: 938
По умолчанию

скачай FASM , скопируй его в окно и нажми F9
получишь исполняемый файл ЕХЕ
__________________
Нашедшего выход - затаптывают первым..
R71MT вне форума   Ответить с цитированием
Старый 14.03.2018, 22:08   #17
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
Репутация: 25
По умолчанию

Так не интересно, я так ничего не пойму, я просто взял ваш код, как некий шаблон (ну я просто начал понимать более менее, как все работает и как все надо организовывать), сейчас пишу свой код
Danddz вне форума   Ответить с цитированием
Старый 19.03.2018, 22:53   #18
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
Репутация: 25
По умолчанию

Доброго времени суток, если вам интересно, кидаю код, который написал сам.
Цитата:
includelib C:\masm32\lib\masm32.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\io_proc.lib
include C:\masm32\include\console.inc

N equ 100 ;length of text
.data
i dd 0 ;temp
text db N dup (?) ;text array
.code
start:
mov ebx, -1;
mov eax, 0
mov ecx, -1
outstrln 'Enter the text to the point. Not more than 100 symbols.'
Read: ;
inc ecx;
cmp ecx, N ; check the number of characters
jl Characters
outstrln 'Many characters'
jmp Exit1 ; error
Characters:
inchar text[ecx]
cmp text[ecx], 97 ;checking the letter 'a'
jnz NotA ;
mov ebx, ecx ;
NotA:
cmp text[ecx], 46 ;checking dot
jnz Read
mov i, ebx;
sub i, ecx ;
mov eax, 1
cmp ebx, -1
jz FoundDot
Change:;
mov text[eax+ebx], '*' ; change to '*'
inc eax ;
inc i ;
jnz Change
mov text[ecx], ' '
FoundDot:
cmp ecx, 0 ;checking the length of the text
jnz OutPut
outstrln 'There are no letters in the text.' ;
OutPut:
outstrln offset text[0] ;text output
jmp Exit1
Exit1: ;exit from the program
MsgBox "Task End", 'Click OK to exit.', MB_OK
exit
end start
Danddz вне форума   Ответить с цитированием
Старый 19.03.2018, 22:54   #19
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
Репутация: 25
По умолчанию

правда тут нет ввода двух текстов , задание поменяли, но все основное есть
Danddz вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несмотря на подключение masm32.inc и masm32.lib не подтягиваются функции stdin и stdout dFender Assembler 1 15.12.2016 14:24
Assembler под Windows (MASM32). Чтение данных массива из файла munthrekosh Assembler 1 05.06.2013 13:49
Преобразование строк tools Общие вопросы C/C++ 1 27.12.2010 15:55
преобразование строк imperceptible4462 Помощь студентам 14 07.09.2010 06:50
преобразование строк euhenia Помощь студентам 0 21.11.2009 21:19


04:15.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru