cyousui 发表于 2013-1-27 19:46:27

关于WIN32汇编循环问题

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 3.asm
; 第一个程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FirstWindow.asm
; Link /subsystem:windows FirstWindow.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szTitle                db        '提示',0
szCaption        db        '欢迎来到汇编世界!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:        mov ecx,2
s:                invoke MessageBox ,NULL, offset szCaption, offset szTitle, MB_OK
                loop s
               
                invoke ExitProcess,NULL
end start
问问大家,运行这个代码,消息框会显示几次?为什么?

メ㊣逆ご帅☆ 发表于 2013-1-27 20:51:21

无限次呵呵
调用完MessageBox会把ECX改掉(可能是7C93005D)
然后你继续减1
再调用
ECX又被改掉,继续循环
无尽的深渊{:5_101:}
好了,说正经的
保护下ECX寄存器就OK



至于如果你对于我为什么知道ECX会改变的话
答案是用OD看下,很简单的哦
OD附加一下你的程序F8单步走几下你就发现问题了

代码如下;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 3.asm
; 第一个程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FirstWindow.asm
; Link /subsystem:windows FirstWindow.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib      user32.lib
include                kernel32.inc
includelib      kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szTitle                db      '提示',0
szCaption      db      '欢迎来到汇编世界!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:      mov ecx,2
s:                push ecx
                                invoke MessageBox ,NULL, offset szCaption, offset szTitle, MB_OK
                                pop ecx
                loop s
               
                invoke ExitProcess,NULL
end start

メ㊣逆ご帅☆ 发表于 2013-1-27 20:52:05

POP ECX忘记对齐了:dizzy:

メ㊣逆ご帅☆ 发表于 2013-1-27 21:06:29

对了,保护完ECX后
因为LOOP会减ECX+循环
所以答案是弹2次。

cyousui 发表于 2013-1-27 22:51:26

谢谢大家的支持,改成如下问题就解决了::lol
.code
start:      mov ecx,2
s:             pushad
               invoke MessageBox ,NULL, offset szCaption, offset szTitle, MB_OK
               popad
               loop s
页: [1]
查看完整版本: 关于WIN32汇编循环问题