首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇编语言新手;我的程序是否遵循正确的代码标准?如果没有,欢迎提供建议。

汇编语言新手;我的程序是否遵循正确的代码标准?如果没有,欢迎提供建议。
EN

Stack Overflow用户
提问于 2011-05-03 14:05:18
回答 3查看 319关注 0票数 1

你好,我一个月前开始编写汇编程序,在一些书籍和stackoverflow社区的帮助下,我一直在用ASM编写程序。我写了这个程序来比较两个数字,并打印哪个数字更大。我想知道我是不是做对了。欢迎任何性能优化技巧!

代码语言:javascript
复制
.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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-03 14:11:36

一个小的优化可能是将所有比较都以结束的通用调用移到L3之后的WriteConsoleA:

代码语言:javascript
复制
.
.
    ;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
.
.
票数 1
EN

Stack Overflow用户

发布于 2011-05-03 14:25:15

那么有意义的标签名称呢?

票数 2
EN

Stack Overflow用户

发布于 2011-05-03 14:30:44

有很多很多事情要做得更好。首先,您正在使用Masm,但没有充分利用它的功能。首先要注意的是,您没有使用invoke或procs,而是坚持使用push/call模型和直接代码流。

我强烈推荐iczelion的优秀教程:

http://win32assembly.online.fr/

要了解Masm的一些功能,第一个教程很不错:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5865688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档