Читайте также: |
|
.model tiny
.code
org 100h
start:
mov ax,13h
int 10h
mov cx,256;Счетчик кругов для loop
mov ax,0003h;Установка видеорижима 3, курсор в 0,0
int 10h;и очистка экрана
mov ax,0b800h
mov es,ax;Загружаем в дополнительный сегментный регистр абсол.адрес
mov di,0;Смещение относительно адреса 0b800h
mov ah,010b;Атрибуты, цвет текста зеленый
mov al,00h;ASCII код
mov es:[di],ax;Грузим не в регистр а по адресу который наход. в регистре
;----------------------
cloop:
add di,4;Смещение на 4 байта, чтобы выглядело нормально
inc al;Следущий ASCII код
mov es:[di],ax;Грузим по адресу в видеопамять
loop cloop;Дальше...
;----------------------
mov ah,10h;Ждем нажатие Any Key
int 16h
ret
end start
Задание:
Написать программу на ассемблере вычисления с выводом данных в окно консоли: Задано массив А из N = 4 элементов. Написать программу определения суммы элементов массива А, для которых биты 0 и 5 совпадают.
Текст программы:
.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
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib
ExitProcess proto: DWORD
. Data; директива определения данных
st1 db "Вывод суммы массива! А", 0
st2 db 10 dup (?), 0
ifmt db "Сумма =% d", 0
masivA db 75,31,88,32
sum dw 0
iden db 0
work1 db 0
work2 db 0
prom dd 0
. Code; директива начала кода
_start:
mov eax, 0
mov ebx, 0
mov ecx, 3
mov edx, 0
lea esi, masivA
M1:
mov prom, ebx
mov al, byte ptr [esi + ebx]; пересылки значения массива в младший регистр al
inc ebx
mov bl, byte ptr [esi + ebx]; пересылки значения массива в младший регистр bl
mov work1, al
mov work2, bl
and eax, 21h
and ebx, 21h
sub eax, ebx проверка сходимости битов
jz M3
mov iden, 0;идентификатор. Он необходим для суммы.
M2:
mov ebx, prom
inc ebx
loop M1
jmp M4
M3:
mov al, work1
dec iden
jz Q1; если идентификатов = 0, тогда перейти на метку Q1
mov iden, 1
mov bl, work2
Q1: add sum, ax; подсчета суммы
add sum, bx; подсчета суммы
jmp M2
M4:
mov ebx, 0
mov bx, sum; пересылка значение суммы в регистр
invoke wsprintf, \
ADDR st2, \
ADDR ifmt, \
ebx
invoke MessageBox, \; функция вывода значения
NULL, \
addr st2, \
addr st1 \
MB_OK
invoke ExitProcess, 0
end _start; окончания программы
Результат работы программы:
Задание:
ввести 2 дробных числа и сложить их и вывести на консоль и в MessageBox.
.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\msvcrt.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\fpu.lib
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;директива определения данных
frmt db "% d",0
buf db 30 dup (0)
buf2 db 20 dup (0)
stdout DWORD?
stdin DWORD?
const dd 10
temp1 dd 0.0
temp2 dd 0.5
temp3 dd 0.5
temp4 dd 0.5
identif1 dd 1
identif2 dd 1
st1 db "Vvedyte a",0
st2 db "Vvedyte b",0
st3 db "Результат вычисления a + b",
st4 db "a + b ="
. Code; директива начала кода
_start:
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout,eax
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin,eax
invoke WriteConsoleA, stdout, ADDR st1, 11, NULL,NULL; VIVOD ST1
invoke ReadConsole, stdin, ADDR buf, 20, ADDR cRead,ULL; чтения числа как символ
invoke crt_atoi, ADDR buf; преобразовать символ в число
mov temp1, eax
lea edi, buf
mov ecx, 30
m1:
mov al, '.'
mov bl, [edi]
xor al, bl
jz m2
inc edi
loop m1
m2:
lea esi, buf2
mov ecx, 20
m3:
inc edi
mov ebx, [edi]
mov [esi], ebx
inc esi
loop m3
invoke crt_atoi, ADDR buf2;преобразовать символ в число
mov temp2, eax
id1:
mov eax, identif1
mov ebx, const
mul ebx
SHL edx, 16; делаем сдвиг на 16
mov dx, ax
mov identif1, edx
mov ecx, temp2
sub ecx, edx
jc id_end1
jmp id1
id_end1:
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov stdout, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov stdin, eax
invoke WriteConsoleA, stdout, ADDR st2, 11, NULL, NULL; VIVOD ST1
invoke ReadConsole, stdin, ADDR buf, 20, ADDR cRead, NULL; чтения числа как символ
invoke crt_atoi, ADDR buf; преобразовать символ в число
mov temp3, eax
lea edi, buf
mov ecx, 30
m4:
mov al, '.'
mov bl, [edi]
xor al, bl
jz m5
inc edi
loop m4
m5:
lea esi, buf2
mov ecx, 20
m6:
inc edi
mov ebx, [edi]
mov [esi], ebx
inc esi
loop m6
invoke crt_atoi, ADDR buf2; преобразовать символ в число
mov temp4, eax
id2:
mov eax, identif2
mov ebx, const
mul ebx
SHL edx, 16;делаем сдвиг на 16
mov dx, ax
mov identif2, edx
mov ecx, temp4
sub ecx, edx
jc id_end2
jmp id2
id_end2:
finit
fild temp1
fiadd temp3
fild temp2
fidiv identif1
fadd st (0), st (1)
fild temp4
fidiv identif2
fadd st (0), st (1)
invoke FpuFLtoA, 0, 10, ADDR st4, SRC1_FPU or SRC2_DIMM
invoke MessageBox, NULL, addr st4, addr st3, MB_OK
invoke ExitProcess, NULL;возврат управления Windows
; И освобождения ресурсов
end _start; директива окончания программы с именем start
Результат работы:
Задание:
Сделать программу расчета формулы в языке Ассемблер. Формула имеет вид: D = 4*Pi*Ha*Fi*D0/L.
Текст программы:
; D = 4 * Pi * Ha * Fi * D0 / L
.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
BSIZE equ 30
. Data; директива определения данных
D0 dword 200;сохранение в 32-разрядной ячейке памяти переменной х
L dword 1; резервирования 32-х разрядов памяти для переменной y
Ha dd 3,4,5
Fi dd 1,2,3
const dd 4
st1 db "Результат вычисления:", 0
st2 db 10 dup (?), 0
. Code; директива начала кода
_start:
lea esi, Ha
lea edi, Fi
mov ebx, 3
m1:
mov ecx, 3
lea edi, Fi
m2:
finit
fldpi; заносим значения Пи
fimul const; Pi * 4
fild dword ptr [esi]
fmul; умножаем результат на На
fild dword ptr [edi]; заносим результат Фи
fmul; умножаем результат на Фи
fild D0; заносим значение D0
fmul; умножаем результат на D0
fild L; заносим значение лянда
fdiv; делим результат на лянда
pushad; сохраняем все регистры общего назначения в стек
invoke FpuFLtoA, 0, 10, ADDR st2, SRC1_FPU or SRC2_DIMM
invoke MessageBox, NULL, addr st2, addr st1, MB_OK
popad; считываем из стека
add edi, 4;следующий элемент в массиве
loop m2
add esi, 4; следующий элемент в массиве
dec ebx
jnz m1; переходить на метку m1 пока ebx не станет равна 0
invoke ExitProcess, NULL; возврат управления Windows
; И освобождения ресурсов
end _start;директива окончания программы с именем start
Результат работы:
Цель задания - это исследование программ с использованием строчных команд.
Задание:
Задано текст из 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; окончания программы
Результат работы программы:
Задание:
Задано текст из 32 символов, состоящий из слов, разделенных одним пробелом. Определить количество слов и количество согласных букв в каждом слове.
Текст программы:
.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-разрядной ячейке памяти переменной х
_sum dword 0
sum dword 0
temp_ecx dd 0
mas1 db 'Privet kak dela u tebya'
mas2 db 'qwrtpsdfghjklzxcvbnmQWRTPSDFGHJKLZXCVBNM'
st1 db "Вывод количества слов:" 0
st2 db 10 dup (?), 0
ifmt db "Количество слов в тексте =% d. Количество согласных букв =% d", 0
. Code; директива начала кода
_start:
lea edi, mas1
mov ecx, 23
mov edx, 0
kol:
mov al, ' '
mov ebx, ecx
repne scasb
sub ebx, ecx
. IF (ebx> 2)
inc _sum
. ENDIF
add ecx, 0
jnz kol
lea edi, mas1
mov ecx, 23
m1:
mov al, ' '
mov bl, [edi]
xor al, bl; проверка слова
jz m2
mov temp_ecx, ecx; хранения регистра
mov ecx, 40
lea esi, mas2
mov al, [esi]
_S1:
. IF (al == bl); сложная условие
inc sum;подсчет количества согласных букв
jmp _mm1
. ELSE; иначе
inc esi; расчет адреса нового числа
mov al, [esi]
loop _S1; перейти, если ecx? 0
. ENDIF
_mm1: mov ecx, temp_ecx;возврат счетчика
_m1:
cld
inc edi
loop m1
jmp m3
m2:
mov edx, 0
jmp _m1
m3:
mov edx, _sum
mov eax, sum; перемещения числа согласных букв
invoke wsprintf, \
ADDR st2, \
ADDR ifmt, \
edx, eax; вывод содержимого
invoke MessageBox, \
NULL, \
addr st2, \
addr st1 \
MB_OK
invoke ExitProcess, 0
end _start; окончания программы
Результат работы программы:
Задачи:
Написать программу с использованием директив условного асемблювання: Задано массивы А и В по N = 30 элементов. Привести алгоритм и программу формирования массива С по правилу: если в элементов Аi и Вi биты 4 и 9 совпадают, то Сi = Аi + Вi. Вывести соответствующие сообщения.
Текст программы:
.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
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib
ExitProcess proto: DWORD
. Data; директива определения данных
st1 db "Вывод", 0
st2 db 10 dup (?), 0
ifmd db "Размер массива =% d. Количество одинаковых битов 4 и 9 =% d", 0
masivA dw 591,34,34,45,2,6,2, -6,1,9,8,6,4,5,45,12,12,31,46,84,54, -54, -25, 88,70,37, -1,0,0,5,0
masivB dw 963,2,7,43,13, -7,65,9,5,100,126,145,123,2,32, -48,84,256,987,20, -54, -12, -200,4,0,0,9,8,215,54
masivC dw 30 dup (0)
work1 dw 0
work2 dw 0
sum dd 0
. Code; директива начала кода
_start:
mov eax, 0
mov ebx, 0
mov ecx, 30
mov edx, 0
lea esi, masivA
lea edi, masivB
lea edx, masivC
M1:
mov ax, [esi]
mov bx, [edi]
inc esi
inc esi
inc edi
inc edi
mov work1, ax; сохранение значений
mov work2, bx; сохранение значений
and eax, 210h; маска для проверки
and ebx, 210h;маска для проверки
. IF (eax == ebx; условие
jmp M3
. ENDIF
M2:
loop M1
jmp M4
M3:
inc sum
mov ax,work1
mov bx,work2
add ax,bx
mov [edx],ax; пересылка сумма в массив С
inc edx
inc edx
jmp M2
M4:
mov ecx,30
mov ebx,sum
invoke wsprintf,\
ADDR st2,\
ADDR ifmd,\
ecx,bx
invoke MessageBox, \
NULL, \
addr st2, \
addr st1 \
MB_OK
invoke ExitProcess, 0
end _start; окончания программы
Результат работы программы:
Дата добавления: 2015-07-16; просмотров: 274 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Массивы на Ассемблере | | | Задание |