Новое в сборке;Соблюдаю ли я соответствующие стандарты кода с этой программой?если нет, советы приветствуются - PullRequest
1 голос
/ 03 мая 2011

Здравствуйте, я начал программировать на ассемблере месяц назад, и с помощью нескольких книг и сообщества здесь, в stackoverflow, я писал программы на ASM.Я написал эту программу, чтобы сравнить 2 числа и вывести, какое число больше.Мне было интересно, правильно ли я все делаю.Любые советы по оптимизации производительности приветствуются!

.386
.model flat, stdcall

option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib

.data
prompt BYTE "Enter First Number:",13,10,0
prompt1 BYTE "Enter Second Number:",13,10,0
prompt2 BYTE "First number greater than second number",13,10,0
prompt3 BYTE "Second number greater than first number",13,10,0
prompt4 BYTE "Both numbers are equal",13,10,0
.data?
outputHandle DWORD ?
inputHandle DWORD ?
nCharsWritten DWORD ?
len1 DWORD ?
buf1 BYTE 200 DUP(?)
len2 DWORD ?
buf2 BYTE 200 DUP(?)
num1 DWORD ?
num2 DWORD ?

.code


main PROC
                ;get output and input handles
                ;first get output handle
                push STD_OUTPUT_HANDLE
                CALL GetStdHandle
                ;save output handle
                mov outputHandle, eax
                ;now get input handle
                push STD_INPUT_HANDLE
                CALL GetStdHandle
                ;save input handle
                mov inputHandle, eax

                ;Ask User for First Number
                push  NULL
                push OFFSET nCharsWritten
                mov eax, LENGTHOF prompt
                dec eax
                push eax
                push OFFSET prompt 
                push outputHandle
                CALL WriteConsoleA

                ;Input First Number
                push NULL
                push OFFSET len1
                push 200
                push OFFSET buf1
                push inputHandle
                CALL ReadConsoleA

                ;prompt user for second number
                push NULL
                push OFFSET nCharsWritten
                mov eax, LENGTHOF prompt1
                dec eax
                push eax
                push OFFSET prompt1
                push outputHandle
                CALL WriteConsoleA

                ;Input Second Number
                push NULL
                push OFFSET len2
                push 200
                push OFFSET buf2
                push inputHandle
                CALL ReadConsoleA

                ;Strip CRLF
                push OFFSET buf1
                CALL StripLF
                push OFFSET buf2
                CALL StripLF

                ;Convert OEM to char
                push OFFSET buf1
                push OFFSET buf1
                CALL OemToChar
                push OFFSET buf2
                push OFFSET buf2
                CALL OemToChar

                ;Convert string to decimal
                push OFFSET buf1
                CALL atodw
                mov num1, eax
                push OFFSET buf2
                CALL atodw
                mov num2, eax
                ;Clear ZF 
                or al,1
                ;Clear CF
                clc
                ;Compare the two numbers
                mov eax, num2                   
                cmp eax, num1               
                jl L1                   ;jump if num2 is less than num1                         
                jg L2                   ;jump if num2 is greater than num1      
                ;both equal
                ;write to console
                push NULL
                push OFFSET nCharsWritten
                push LENGTHOF prompt4
                push OFFSET prompt4
                push outputHandle
                CALL WriteConsoleA
                jmp L3
            L1:
                ;Write to console
                push NULL
                push OFFSET nCharsWritten
                push LENGTHOF prompt2
                push OFFSET prompt2
                push outputHandle
                CALL WriteConsoleA
                jmp L3

            L2:
                ;Write to console
                push NULL
                push OFFSET nCharsWritten
                push LENGTHOF prompt3
                push OFFSET prompt3
                push outputHandle
                CALL WriteConsoleA
                jmp L3

            L3:
                push NULL
                CALL ExitProcess
        main ENDP
        END main

Ответы [ 3 ]

2 голосов
/ 03 мая 2011

Как насчет значимых имен ярлыков?

1 голос
/ 03 мая 2011

Небольшой оптимизацией может быть перемещение общего вызова в WriteConsoleA, с которым все сравнения заканчиваются после L3:

.
.
    ;Compare the two numbers
    mov eax, num2                   
    cmp eax, num1               
    jl L1                   ;jump if num2 is less than num1                         
    jg L2                   ;jump if num2 is greater than num1      
    ;both equal
    ;write to console
    push NULL
    push OFFSET nCharsWritten
    push LENGTHOF prompt4
    push OFFSET prompt4
    push outputHandle
    ; CALL WriteConsoleA <- remove
    jmp L3
L1:
    ;Write to console
    push NULL
    push OFFSET nCharsWritten
    push LENGTHOF prompt2
    push OFFSET prompt2
    push outputHandle
    ; CALL WriteConsoleA <- remove
    jmp L3

L2:
    ;Write to console
    push NULL
    push OFFSET nCharsWritten
    push LENGTHOF prompt3
    push OFFSET prompt3
    push outputHandle
    ; CALL WriteConsoleA ; <- remove
    ; jmp L3 ; unnecessary unless new code added in-between

L3:
    CALL WriteConsoleA
    push NULL
    CALL ExitProcess
.
.
0 голосов
/ 03 мая 2011

Много много чего нужно сделать лучше. Прежде всего, вы используете Masm, но не используете его силу. Первое, что следует заметить, это то, что вы не используете invoke или procs, а придерживаетесь модели push / call и прямого потока кода.

Я бы очень рекомендовал бы отличные уроки iczelion:

http://win32assembly.online.fr/

Хороший первый урок, чтобы увидеть некоторые возможности Масма:

http://win32assembly.online.fr/tut2.html

...