Всем привет!

С понедельника (4 июля 2016 года) начал изучать взрывной для меня и для моего моСка курс

«PROGRAMMING ASSEMBLER»

Преподаёт нам Александр Беляков, который приехал аж из Киева (за что ему огромное спасибо). Курс очень интересный и развивающий ваш моСк.

Код мы пишем в NotePad++ (скачать) с подсветкой синтаксиса Assebly, а компилируем и дебажим в Microsoft Visual Studio 15 (скачать).

Чуть позже выложу весь курс занятий, а пока хотел выложить пример решения простенькой задачи (для меня, как начинающего это было совсем не просто).

ЗАДАЧА:

Создайте программу, выводящую на экран все четырёхзначные числа последовательности 1000 1003 1006 1009 1012 1015 ….

Решение:

2

3

4

;06.07.2016
;Создайте программу, выводящую на экран все четырёхзначные числа последовательности 1000 1003 1006 1009 1012 1015 ….
.MODEL FLAT, STDCALL
SetConsoleTitleA PROTO: DWORD; функция установки заголовка консоли
GetStdHandle PROTO: DWORD
WriteConsoleA PROTO: DWORD, :DWORD, :DWORD, :DWORD, :DWORD
ReadConsoleA PROTO:DWORD, :DWORD, :DWORD, :DWORD, :DWORD
ExitProcess PROTO:DWORD
Sleep PROTO: DWORD

.const
sConsoleTitle BYTE «1000 to 9999»,0
numC WORD           1000d
numB WORD           9999d
sleepTime WORD   5000d
increment WORD   3d
stringLenght BYTE 6d
.data
number BYTE 4 DUP(0),10,13;Массив для хранения разрядов числа (10,13 — символы перевода каретки)

.code
main PROC

;push OFFSET sConsoleTitle
;call SetConsoleTitleA
INVOKE SetConsoleTitleA, OFFSET sConsoleTitle
xor                     ECX,ECX
mov                   CX,numC
;цикл
wh1:
cmp                  CX,numB
jnl endwh1
call show
add                 CX, increment
jmp wh1
endwh1:

;push sleepTime
;call Sleep
INVOKE Sleep, sleepTime

;push 0
;call ExitProcess
INVOKE ExitProcess, 0
ret
Main ENDP

; процедура разбития на разряды
show PROC
LOCAL hStdout :DWORD
push                  EAX
INVOKE GetStdHandle, -11
mov hStdout, EAX
pop                   EAX
;push EAX
;выделение 1000
mov                 AX,CX
xor                   DX,DX
mov                 BX,1000d
div                   BX
or                     AL,30h
mov number[0],AL
;выделение 100
mov               AX,DX
xor                 DX,DX
mov               BX,100d
div                 BX
or                  AL,30h
mov number[1],AL
;выделение 10
mov             AX,DX
xor               DX,DX
mov             BX,10d
div               BX
or                 AL,30h
mov number[2],AL
;выделение единиц
or                DL,30h
mov number[3],DL
;Выводим число
push          ECX
;push 0
;push 0
;push 6d
;push OFFSET number
;push hStdout
;call WriteConsoleA
INVOKE WriteConsoleA, hStdout, OFFSET number, stringLenght, 0, 0
pop           ECX
ret
show ENDP
END main

 

Результат работы:

1

Поддерживаю критику в комментариях. Спасибо

С Уважением, C0mstr3am

 

автор

От news

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *