找问题(逻辑漏洞)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; by 小甲鱼, http://www.fishc.com
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 功能:高级语法while-endw的使用,累加1到100的和。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
a db100 dup(0)
bufferdb100 dup(0)
CapMsgdb'输出', 0
szFmt db'结果是:%d', 0
i db1
sum db0
.code
start:
mov edi, 0
.while( i <= 100 )
mov al, i
mov a, al
inc i
inc edi
.endw
mov i, 0
mov edi, 0
.while( i < 100 )
mov al, a
add sum, al
inc i
inc edi
.endw
xor eax, eax
mov al, sum
invokewsprintf, ; 格式化字符串输出函数,有点类似 printf
addr buffer, ; 存放字符串的缓冲区
addr szFmt, ; 格式化输出的格式
eax
invokeMessageBox,
NULL,
offset buffer,
offset CapMsg,
MB_OK
invokeExitProcess, 0; 结束进程
end start
以上代码计划求从1加到100的和,但实现后确实这样的结果:
请思考后改正并校对回复校对正确答案:
**** Hidden Message *****
win32汇编语言这个版块终于被鱼哥的几个帖子顶上去了,哈哈 al 只能存8位二进制
5050=1001110111010
而10111010= 186 ^_^ 溢出了吧。。。。 学习一下,.感谢 经过实验,错误有:sum db 0,改为sum dw 0.34行,mov i,1.第二个while循环要把eax清零,38,44行al 改为ax.36行为<=. al能放得下,是sum放不下。不过我想看看隐藏了什么。。。 学习了 。 没看出来 .
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
a db100 dup(0)
bufferdb100 dup(0)
CapMsgdb'输出', 0
szFmt db'结果是:%d', 0
i db1
sum dw0 ;**********
.code
start:
;*************
mov edi, 0
.while( i <= 100 )
mov al, i
mov a, al
inc i
inc edi
.endw
xor eax,eax
mov i, 0
mov edi, 0
.while( i < 100 )
mov al, a
add sum, ax ;***********
inc i
inc edi
.endw
xor ax, ax
mov ax, sum ;*************
invokewsprintf, ; 格式化字符串输出函数,有点类似 printf
addr buffer, ; 存放字符串的缓冲区
addr szFmt, ; 格式化输出的格式
eax
invokeMessageBox,
NULL,
offset buffer,
offset CapMsg,
MB_OK
invokeExitProcess, 0; 结束进程
end start 看一下,参想是否正确 自己先做一遍...回来看结果... 看看哪儿我认错了 看看哪错了
真是被感动的痛哭流涕…… 看看隐藏的吧 强烈支持楼主ing…… 激动人心,无法言表! 强烈支持楼主ing…… 强烈支持楼主ing……