Цель задания - это исследование программ с использованием строчных команд.
Задание:
Задано текст из 30 символов. Сжать текст, оставив между словами по одному пропуску.
Текст программы:
.386; Директива определения типа микропроцессора
. Model flat, stdcall; задачи линейной модели памяти
; И соглашения ОС Windows
option casemap: none; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib
ExitProcess proto: DWORD
BSIZE equ 30
. Data; директива определения данных
_a dword 3.0; сохранение в 32-разрядной ячейке памяти переменной х
_prob dword 0
_sum dd 0
mas1 db 'Privet kak dela u tebya'
mas2 db 30 dup (0), 0
st1 db "Вывод количества пробелов", 0
st2 db 10 dup (?), 0
ifmt db "Количество лишних пробелов в тексте =% d", 0
. Code;директива начала кода
_start:
lea edi, mas1
lea esi, mas2
mov ecx, 30; счетчик
mov edx, 1
mov ebx, 0
m1:
mov eax, 0
mov al, ''
mov bl, [edi]
xor al, bl; проверка равенство сроки пробел
jz m2
mov _sum, 0; сумма пробелов равна нулю
_m1: mov edx, 1
mov ax, [edi];Копирование сроки в сроке без лишних
mov [esi], ax; пробелов
inc esi
_m2:
cld
inc edi
loop m1; уменьшения счетчик
jmp m3; безусловный переход на выводок
m2:
inc _sum; инкрементирование
sub edx, _sum; проверка: это первый пробел или нет
jz _m1
mov edx, 1
inc _prob;подсчитывание лишних пробелов
jmp _m2
m3:
mov edx,0
mov edx,_prob
mov ecx,30
lea edi,mas1
mov eax,0
m4:
mov [edi],ax
inc edi
loop m4
lea edi,mas1
lea esi,mas2
mov ecx,30
m5:
mov ax,[Edi]; копирование второй строки в первую
mov [esi],x
inc esi
inc edi
cld
loop m5
invoke wsprintf, \
ADDR st2, \
ADDR ifmt, \
edx
invoke MessageBox, \
NULL, \
addr st2, \
addr st1 \
MB_OK
invoke ExitProcess, 0
end _start; окончания программы
Результат работы программы: