【问题标题】:Endless loop with assember带汇编程序的无限循环
【发布时间】:2011-08-07 04:58:27
【问题描述】:

好的,我是 PC Assembler 的新手。我正在尝试编写一个程序,但它不会停止循环。我猜 ECX 寄存器正在被修改?我该如何解决这个问题?谢谢。

DATA SECTION
;
KEEP DD 0                   ;temporary place to keep things
;
CODE SECTION
;
START:
MOV ECX,12
TOPOFLOOP:
PUSH -11                        ;STD_OUTPUT_HANDLE
CALL GetStdHandle           ;get, in eax, handle to active screen buffer
PUSH 0,ADDR KEEP            ;KEEP receives output from API
PUSH 5,'bruce'                  ;5=length of string
PUSH EAX                    ;handle to active screen buffer
CALL WriteFile
XOR EAX,EAX                 ;return eax=0 as preferred by Windows
LOOP TOPOFLOOP
ENDLABEL:
RET

【问题讨论】:

    标签: windows loops x86 dos assembly


    【解决方案1】:

    在大多数 x86 调用约定中,包括 Windows API 函数使用的stdcall 约定,ECX 是调用者保存寄存器——被调用函数不需要确保在返回时寄存器的值相同就像它被调用时一样。您必须将其保存在您自己的代码中的安全位置。

    【讨论】:

    • 无论这是否属实,作为一名汇编程序员,您必须注意将感兴趣的值获取到寄存器中,确保子程序调用不会破坏它们(寄存器是宝贵的,而子程序也需要使用其中的一些)。一种方法是制定有关寄存器管理的约定(例如,STDCALL),提示您必须做什么(例如,如果您使用遵循 STDCALL 约定的子例程,并且 ECX 对您很重要,则需要将其保存在子例程中打电话)。
    • ... 在子例程调用中保存寄存器的常用方法是将其压入堆栈(这取决于堆栈不包含子例程感兴趣的任何内容;如果包含,您需要另一个技巧)。通常的方案是 PUSH REG\CALL SUBR\POP REG,在 OPs 代码 REG==ECX。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多