Вывод таблицы ASCII. win32 - Assembler/MASM

Узнай цену своей работы

Формулировка задачи:

Помогите найти(сделать) программу на масм32 для вывода символов ASCII. Облазил весь инет, иностранные форумы в т.ч., всюду версии лишь х16. Ничего рабочего на win32, будто бы вообще никто, кроме меня не интересовался подобным. Заранее спасибо

Решение задачи: «Вывод таблицы ASCII. win32»

textual
Листинг программы
.486
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        aszCrLf         db      0Dh, 0Ah, 0
        aszPressLeftAlt db      0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        BufLen          dd      ?
        Buffer          db      1024 dup(?)
.code
 
start   proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
        ;очистка экрана
        invoke  ClearScreen
        ;заполнение строки
        mov     ch,     10h
        mov     eax,    03020100h
        mov     bx,     0A0Dh
        lea     edi,    [Buffer]
        @@forI:
                mov     cl,     04h
                @@forJ:
                        stosd
                        add     eax,    04040404h
                        dec     cl
                jnz     @@forJ
                mov     [edi],  bx
                add     edi,    2
                dec     ch
        jnz     @@forI
 
        sub     edi,    offset Buffer
        mov     [BufLen],       edi
 
        ;
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
;ожидание нажатия Left Alt
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\
                LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL
        @@WaitForLAlt:
                invoke  GetAsyncKeyState, VK_LMENU
                and     eax,    8000h
        jz      @@WaitForLAlt
        ;завершение программы
        invoke  ExitProcess, 0
start   endp
 
end start

Объяснение кода листинга программы

  1. .486 - это директива компилятора, которая указывает, что код написан для процессора 80486.
  2. .model flat, stdcall - это директива компилятора, которая определяет модель памяти и стиль вызова функций.
  3. option casemap :none - это директива компилятора, которая отключает преобразование регистра символов.
  4. include \masm32\include\windows.inc - это директива компилятора, которая включает в код библиотеку Windows API.
  5. include \masm32\include\user32.inc - это директива компилятора, которая включает в код библиотеку User32 API.
  6. include \masm32\include\kernel32.inc - это директива компилятора, которая включает в код библиотеку Kernel32 API.
  7. include \masm32\include\masm32.inc - это директива компилятора, которая включает в код библиотеку MASM32 API.
  8. includelib \masm32\lib\user32.lib - это директива компилятора, которая включает в код библиотеку User32.
  9. includelib \masm32\lib\kernel32.lib - это директива компилятора, которая включает в код библиотеку Kernel32.
  10. includelib \masm32\lib\masm32.lib - это директива компилятора, которая включает в код библиотеку MASM32.
  11. hConsoleOutput HANDLE ? - это переменная, которая содержит дескриптор вывода консоли.
  12. hConsoleInput HANDLE ? - это переменная, которая содержит дескриптор ввода консоли.
  13. BufLen dd ? - это переменная, которая содержит длину буфера.
  14. Buffer db 1024 dup(?) - это переменная, которая содержит буфер.
  15. ch db 10h - это переменная, которая содержит символ, который будет выводиться.
  16. eax dd 03020100h - это переменная, которая содержит значение, которое будет выводиться в регистре EAX.
  17. bx db 0A0Dh - это переменная, которая содержит значение, которое будет выводиться в регистре BX.
  18. edi dd ? - это переменная, которая используется в качестве индекса для буфера.
  19. aszCrLf db 0Dh, 0Ah, 0 - это строка, которая содержит символ CR, символ LF и символ NUL.
  20. aszPressLeftAlt db 0Dh, 0Ah, 0Dh, 0Ah, Press Left Alt to exit, 0 - это строка, которая содержит сообщение Press Left Alt to exit.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.467 из 5
Похожие ответы