Чтение параметров командной строки

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

Например, если ваша программа называется KOE.COM и вы запускаете ее, набрав команду

KOE 4abcs

в командной строке DOS, то процедура ReadCL вернет строку 4abcs в формате ASCIIZ.

ReadCL proc ;чтение параметров командной строки в буфер по адресу ES:[DI] ;DS должен остаться неизменным после запуска программы (=PSP)
mov SI,80h ;адрес парамтеров
xor CX,CX
mov CL,[SI] ;длина в байтах
inc SI ;игнорируем байт длины
rep movsb ;перемещаем строку в буфер
mov AL,0
stosb ;завершаем строку ASCIIZ нулем
ret
ReadCL endp

Реклама

Перевод чисел в двоичную форму (в виде строки)

Данная процедура конвертирует 16-битное слово в строку ASCIIZ, т.е. число 7 преобразовывается в строку 0000000000000111. Лидирующие нули включаются в строку. Строка ASCIIZ — это набор символов, завершающихся 0.

NmbrToBi$ proc ;POW36
;Входные данные: AX — смещение строки, BX — число, которое необходимо преобразовать
;Выходные данные: Строка ASCIIZ. Регистры не сохраняются.
mov DI,AX ;смещение строки
mov DX,8000h ;проверочное слово, 1 в позиции 15
mov CX,16 ;обрабатываем 16 бит
NumberTo_B0:
mov AL,48 ;символ ‘0’
test BX,DX ;бит равен 1?
jz NumberTo_B
inc AL ;символ ‘1’
NumberTo_B:
stosb ;записываем в строку ‘1’ или ‘0’
shr DX,1 ;сдвигаем тестовый бит вправо
loop NumberTo_B0
mov [DI],DL ;завершаем строку 0
ret
NmbrToBi$ endp

Матрица 3 X 4. Определить максимальный элемент каждой строки. Результат выполнения программы вывести в окно консоли.

.386 ; директива определения типа микропроцессора

.model flat, stdcall ; задание линейной модели памяти
option casemap:none ; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
ExitProcess proto: dword ; прототип API-функции

DATE1 STRUCT ; тип данных СТРУКТУРА с именем DATE1
elem1 db ? ; имя первого поля структуры
elem2 db ? ; имя второго поля структуры
elem3 db ? ; имя третьего поля структуры
elem4 db ? ; имя четвертого поля структуры
DATE1 ENDS
.data ; директива определения данные
max db 0
nomer db 1
str1 DATE1 <20,9,2,15> ; структура с именем str1
str2 DATE1 <6,31,1,3> ; структура с именем str2
str3 DATE1 <4,6,155,2> ; структура с именем str2
st1 db » Вывод максимальных чисел «,0
st2 db 180 dup(?),0
stemp db 0
stemp2 db 3 dup(?),0
st4 db » Нажмите Ок»,0
st3 db «-й ряд имеет максимальное число = »
kol3 = $ — st3
kol4 = $ — st4
ifmt db «%d «,0
.code ; директива начала сегмента-данных
start: ; метка начала программы с именем start
xor edx,edx ; заполнение нулями
mov ebx,3 ; загрузка количества строк
lea esi, str1 ; загрузка адреса первой строки структуры
lea edi,st2
m1: mov ecx,4 ; количество элементов в строке
mov max,0
m2: mov al[esi] ; загрузка элемента из строки структуры
.IF (al > max)
mov max,al
.ENDIF
jmp m4 ; безусловный переход, если наоборот
m3: add edx,eax ; добавление негативных элементов строки структуры
m4: inc esi ; подготовка адреса нового элемента
loop m2 ; есх := ecx – 1 и переход на m3, если не нуль

mov eax,0
mov al,nomer
invoke wsprintf \ ; API-ФУНКЦИЯ превращения числа
ADDR stemp \ ; адрес буфф., куда будет записан помет. символов
ADDR ifmt \ ; адрес строки превращения формата
eax ; регистр, содержание которого превращается
mov al,stemp
mov [edi],al
inc edi

lea esi, st3
mov ecx,kol3

_m1:
mov al[esi] mov [edi],al
inc esi
inc edi
loop _m1
mov eax,0
mov al,max

invoke wsprintf \ ; API-ФУНКЦИЯ превращения числа
ADDR stemp2 \ ; адрес буфф., куда будет записан помет. символов
ADDR ifmt \ ; адрес строки превращения формата
eax ; регистр, содержание которого превращается
lea esi, stemp2
mov ecx,3
z1:
mov al[esi] mov [edi],al
inc edi
inc esi
loop z1

mov al,10
mov [edi],al
inc edi
inc nomer

dec ebx ; ebx := ebx – 1
.IF ebx == 2
lea esi,str2 ; загрузка адреса новой строки
jmp m1 ; переход на новый цикл
.ELSEIF ebx == 1
lea esi,str3 ; загрузка адреса новой строки
jmp m1 ; переход на новый цикл
.ENDIF

mov al,10
mov [edi],al
inc edi
lea esi, st4
mov ecx,kol4
inc esi
_z1:
mov al[esi] mov [edi],al
inc esi
inc edi
loop _z1

invoke MessageBox \ ; API-ФУНКЦИЯ выведения окна консоли
NULL \ ; hwnd – идентификатор окна
addr st2 \ ; адрес строки, который содержит текст сообщения
addr st1 \ ; адрес строки, который содержит заглавие сообщения
MB_OK ; вид диалогового окна

invoke ExitProcess, 0 ; возвращение управления ОС Windows
end start ; директива окончания программы с именем start.386 ; директива определения типа микропроцессора
.model flat, stdcall ; задание линейной модели памяти
option casemap:none ; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
ExitProcess proto: dword ; прототип API-функции

DATE1 STRUCT ; тип данных СТРУКТУРА с именем DATE1
elem1 db ? ; имя первого поля структуры
elem2 db ? ; имя второго поля структуры
elem3 db ? ; имя третьего поля структуры
elem4 db ? ; имя четвертого поля структуры
DATE1 ENDS
.data ; директива определения данные
max db 0
nomer db 1
str1 DATE1 <20,9,2,15> ; структура с именем str1
str2 DATE1 <6,31,1,3> ; структура с именем str2
str3 DATE1 <4,6,155,2> ; структура с именем str2
st1 db » Вывод максимальных чисел «,0
st2 db 180 dup(?),0
stemp db 0
stemp2 db 3 dup(?),0
st4 db » Нажмите Ок»,0
st3 db «-й ряд имеет максимальное число = »
kol3 = $ — st3
kol4 = $ — st4
ifmt db «%d «,0
.code ; директива начала сегмента-данных
start: ; метка начала программы с именем start
xor edx,edx ; заполнение нулями
mov ebx,3 ; загрузка количества строк
lea esi, str1 ; загрузка адреса первой строки структуры
lea edi,st2
m1: mov ecx,4 ; количество элементов в строке
mov max,0
m2: mov al[esi] ; загрузка элемента из строки структуры
.IF (al > max)
mov max,al
.ENDIF
jmp m4 ; безусловный переход, если наоборот
m3: add edx,eax ; добавление негативных элементов строки структуры
m4: inc esi ; подготовка адреса нового элемента
loop m2 ; есх := ecx – 1 и переход на m3, если не нуль

mov eax,0
mov al,nomer
invoke wsprintf \ ; API-ФУНКЦИЯ превращения числа
ADDR stemp \ ; адрес буфф., куда будет записан помет. символов
ADDR ifmt \ ; адрес строки превращения формата
eax ; регистр, содержание которого превращается
mov al,stemp
mov [edi],al
inc edi

lea esi, st3
mov ecx,kol3

_m1:
mov al[esi] mov [edi],al
inc esi
inc edi
loop _m1
mov eax,0
mov al,max

invoke wsprintf \ ; API-ФУНКЦИЯ превращения числа
ADDR stemp2 \ ; адрес буфф., куда будет записан помет. символов
ADDR ifmt \ ; адрес строки превращения формата
eax ; регистр, содержание которого превращается
lea esi, stemp2
mov ecx,3
z1:
mov al[esi] mov [edi],al
inc edi
inc esi
loop z1

mov al,10
mov [edi],al
inc edi
inc nomer

dec ebx ; ebx := ebx – 1
.IF ebx == 2
lea esi,str2 ; загрузка адреса новой строки
jmp m1 ; переход на новый цикл
.ELSEIF ebx == 1
lea esi,str3 ; загрузка адреса новой строки
jmp m1 ; переход на новый цикл
.ENDIF

mov al,10
mov [edi],al
inc edi
lea esi, st4
mov ecx,kol4
inc esi
_z1:
mov al[esi] mov [edi],al
inc esi
inc edi
loop _z1

invoke MessageBox \ ; API-ФУНКЦИЯ выведения окна консоли
NULL \ ; hwnd – идентификатор окна
addr st2 \ ; адрес строки, который содержит текст сообщения
addr st1 \ ; адрес строки, который содержит заглавие сообщения
MB_OK ; вид диалогового окна

invoke ExitProcess, 0 ; возвращение управления ОС Windows
end start ; директива окончания программы с именем start

Задано матрицу 3 х 6. Определить элементы кратные 3 в каждой строке и поместить на их место элемент, номер которого совпадает с номером строки. Результат выполнения программы вывести в окно консоли.

.686;директива определения типа микропроцессора

. 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
include \masm32\include\msvcrt.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\fpu.lib

DATE1 STRUCT; тип данных СТРУКТУРА с именем DATE1
elem1 db? ; Имя первого поля структуры
elem2 db? ; Имя второго поля структуры
elem3 db? ; Имя третьего поля структуры
elem4 db? ; Имя четвертого поля структуры
elem5 db? ; Имя четвертого поля структуры
elem6 db? ; Имя четвертого поля структуры

DATE1 ENDS
. Data; директива определения данных
iden db 0
temp_ecx dd 0
max db 0
nomer db 1
const1 dw 3
stemp db 3 dup (0), 0
stroka db 0
stdout DWORD?
stdin DWORD?
str1 DATE1 <20,9,2,15,10,3>; структура с именем str1
str2 DATE1 <6,31,1,3,6,11>; структура с именем str2
str3 DATE1 <4,6,155,2,54,66>;структура с именем str2
text db «Format massiva zakoncheno», 0
st1 db «Вывод измененного массива чисел», 0
st2 db 180 dup (?), 0

ifmt db «% d», 0
. Code; директива начала сегмента-данных
start:; метка начала программы с именем start
xor edx, edx;заполнения нулями
mov ebx, 3; загрузки количества строк
lea esi, str1; загрузки адреса первой строки структуры
m1: mov ecx, 6; количество элементов в строке
mov max, 0
inc stroka
m2: mov al, [esi];загрузка элемента из строки структуры
mov edx, 0
idiv const1
. IF (edx == 0)
mov ebx, 7
sub ebx, ecx; определения элемента массива кратном 3
mov [esi], bl; запись номера места в этот элемент
. ENDIF

jmp m4; безусловный переход, если наоборот

m4: inc esi;подготовка адреса нового элемента
mov eax, 0
loop m2; есх: = ecx — 1 и переход на m2, если не ноль

lea esi, str2
. IF (stroka == 1)
jmp m1
. ENDIF
lea esi, str3
. IF (stroka == 2)
jmp m1
. ENDIF

lea edi, st2
lea esi, str1
mov eax, 10
mov [edi], eax
inc edi
mov eax, 13
mov [edi], eax
inc edi

m5:
mov ecx, 6
inc iden
_M5:
mov eax, 0
mov al, [esi] mov temp_ecx, ecx

pushad; сохраняем все регистры общего назначения в стек
invoke wsprintf, \; API-функция преобразования числа
ADDR stemp, \; адрес буфф, куда будет записана помет. символов
ADDR ifmt, \;адрес строки преобразования формата
eax; регистр, содержимое которого превращается

popad; считываем из стека
lea eax, stemp
mov ecx, 4
_m1:
mov dl, [eax] mov [edi], dl
inc eax
inc edi
loop _m1
inc esi
mov dl, »
mov [edi], dl
inc edi
mov ecx, temp_ecx
loop _M5
mov dl, 10
mov [edi], dl
inc edi
mov dl, 13
mov [edi], dl
. IF (iden == 1); условие
lea esi, str2
jmp m5
. ELSEIF (iden == 2); условие
lea esi, str3
jmp m5
. ENDIF

invoke GetStdHandle, STD_OUTPUT_HANDLE
mov stdout, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov stdin, eax
invoke WriteConsoleA, stdout, ADDR text, 30, NULL,NULL; VIVOD
invoke WriteConsoleA, stdout, ADDR st2, 110, NULL,NULL; VIVOD ST2
invoke Sleep,2000
invoke ExitProcess,0 возврат управления Windows
; И освобождения ресурсов
end start; директива окончания программы с именем start

Ввести двумерный массив А (N, N). Составить алгоритм и программу подсчета среднего арифметического значений двумерного массива. Найти отклонения от среднего в элементов первой строки.

.686; Директива определения типа микропроцессора

. 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
include \masm32\include\msvcrt.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\fpu.lib

. Data; директива определения данных
buf db 30 dup (?)
stdout DWORD?
stdin DWORD?
cRead dd?
temp dd?
st1 db «Vvesty masiv:
st2 db «Вывод результата отклонения от среднего арифметического», 0
st3 db 10 dup (0)
sum dd 0
sum1 dd 0
mas1 dd 1,2,3,4,5,6,7,8,9
const1 dd 100
_c dd 9
_cc dd 3
. Code; директива начала кода
_start:
lea esi, mas1; загрузки адреса начала массива
mov ecx, _c
m1:
mov ebx, ecx
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov stdout, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov stdin, eax
invoke WriteConsoleA, stdout, ADDR st1, 14, NULL, NULL; VIVOD ST1
invoke ReadConsole, stdin, ADDR buf, 20, ADDR cRead, NULL; чтения числа как символ
invoke crt_atoi, ADDR buf;преобразовать символ в число
mov [esi],eax
add esi,4
mov ecx,ebx
loop m1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

lea esi,mas1; загрузки адреса начала массива
mov ecx,_c
finit
fld sum
m2:
fild dword ptr [esi] faddp st (1),st

add esi,
loop m2
fild _c
fdiv
lea esi, mas1
mov ecx, _cc
fld sum1

m3: fild dword ptr [esi] faddp st (1), st

add esi, 4
loop m3
fild _cc
fdiv
fdiv

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
invoke FpuFLtoA, 0, 10, ADDR st3, SRC1_FPU or SRC2_DIMM
invoke MessageBox, NULL, addr st3, addr st2, MB_OK
invoke ExitProcess, NULL;возврат управления Windows
; И освобождения ресурсов

end _start; директива окончания программы с именем start