小甲鱼 发表于 2012-6-3 04:24:32

找问题(逻辑漏洞)


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 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 *****

楚门 发表于 2012-6-3 23:17:44

win32汇编语言这个版块终于被鱼哥的几个帖子顶上去了,哈哈

ITaman 发表于 2012-6-7 20:20:28

al 只能存8位二进制
5050=1001110111010
               而10111010= 186 ^_^

sunhack 发表于 2012-6-17 16:13:00

溢出了吧。。。。

小伙贼胖 发表于 2012-6-21 15:28:34

学习一下,.感谢

我是桃川人 发表于 2012-8-16 00:19:11

经过实验,错误有:sum db 0,改为sum dw 0.34行,mov i,1.第二个while循环要把eax清零,38,44行al 改为ax.36行为<=.

Seandor 发表于 2012-8-22 23:23:57

al能放得下,是sum放不下。不过我想看看隐藏了什么。。。

一朵时光_bobo 发表于 2012-8-23 01:19:07

    学习了 。

vigiles163com 发表于 2012-10-6 14:49:08

没看出来                                 .

殘燭之淚 发表于 2012-12-24 15:31:04


      .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

sbwcwusi 发表于 2013-2-17 10:57:23

看一下,参想是否正确

Win2003 发表于 2013-3-14 13:53:50

自己先做一遍...回来看结果...

向往青莲 发表于 2013-3-18 19:27:09

看看哪儿我认错了

119400117 发表于 2013-3-20 13:23:35

看看哪错了


lijunpeng71 发表于 2013-5-5 15:42:24

真是被感动的痛哭流涕……

183560656 发表于 2013-5-12 00:38:23

看看隐藏的吧

sherlock24 发表于 2013-6-4 18:25:51

强烈支持楼主ing……

蛋定蝸牛 发表于 2013-6-5 14:35:42

激动人心,无法言表!

ningbingjian 发表于 2013-8-11 21:18:19

强烈支持楼主ing……

ζ_Y°シ 发表于 2013-12-18 01:53:40

强烈支持楼主ing……
页: [1] 2 3
查看完整版本: 找问题(逻辑漏洞)