Ассемблер. Начало.

Discussion in 'Реверсинг' started by comstream, 24 Jan 2019.

  1. comstream

    comstream Member

    Joined:
    11 Aug 2015
    Messages:
    35
    Likes Received:
    7
    Reputations:
    0
    Всем привет!

    Не так давно начал изучать взрывной для меня и для моего моСка курс

    «PROGRAMMING ASSEMBLER»

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

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

    ЗАДАЧА:

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

    Решение:


    [​IMG]

    [​IMG]

    [​IMG]

    Создайте программу, выводящую на экран все четырёхзначные числа последовательности 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



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

    [​IMG]

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

    С Уважением, C0mstr3am
     
    #1 comstream, 24 Jan 2019
    Last edited: 24 Jan 2019
  2. Turanchocks_

    Turanchocks_ Well-Known Member

    Joined:
    11 May 2013
    Messages:
    947
    Likes Received:
    1,853
    Reputations:
    10
    Для начала - прячем код под спойлер. Смайлики в простынях - пригрешение
     
    K800 likes this.
  3. comstream

    comstream Member

    Joined:
    11 Aug 2015
    Messages:
    35
    Likes Received:
    7
    Reputations:
    0
    Исправляю. Спасибо
     
Loading...