killkk 发表于 2012-11-13 02:57:06

发个外女贴,示关注!Win32 汇编实现 从1加到100的五种写法


       在鱼C呆了段时间了,差不多有一年多了吧。记得那在学王爽的16位汇编,在网上查资料时无意来到了鱼C,自然就Down了一个小甲鱼的视频看下,只看了第一个,对!就只看了一个,心中就已经打定了注意准备支持他了!第二天就买了鱼C光盘后一直看视频教程因为确实讲得太好了,非常的仔细。反正我是觉得讲得很到位了,因为在看书时留下的问题再结合看视频教程一下就醒目了。,也常来论坛潜水。学到了不少的东东。
   看Win32的汇编也有一个月了,之前电脑卖了。就只是看理论而已,很少敲,这段时间天天看了小甲鱼的视频后颇有感悟。就写了这个程序,调试了一个多小时通过!发个贴算做个笔记吧,希望能结交到兴趣相同的朋友们!
   本人还是个大菜鸟,高手勿喷。。谢谢~~{:7_168:}

;------------------------------------
;【1】   
;------------------------------------
;程序功能:计算1+2+3+4..+100 的结果
; 将其结果用MessageBox打印到屏幕上
;------------------------------------
.386
.model flat,stdcall
option casemap:none
;------Include 文件定义--------------
includewindows.inc
includeuser32.inc
includelib user32.lib
includekernel32.inc
includelib kernel32.lib

;----Data Segment------------
.data
dwSum   dd 0    ;计算和,最终的结果
dwCount   dd 0    ;计数器,从1开始到100结束
szCaption      db '正在计算1+2+..+100..',0
szResult   db'结果为: %d',0;显示为整形结果。wspintf缓冲区的一个参数,下面要用到
szBuffer   db128 dup(0)
;-----Code Segment----------
.code
;********************计算结果子程序******************
_Result proc
      xor eax,eax       ;清零
   .while (dwCount<100)   ;判断dwCount的值,如果小于100就执行下面的循环      <--
      inc eax   ;eax==1                                                                                                       |
      add dwSum,eax   ;和为1                                                                                          |
      mov dwCount,eax;dwCount==1                                                                         __|
      .endw
   ret
   
_Result endp   
   
start:   call _Result
invoke wsprintf,addr szBuffer,addr szResult,dwSum   ;将结果参数保存到缓冲区
invoke MessageBox,NULL,addr szBuffer,addr szCaption,MB_OK or MB_ICONINFORMATION;以便MessageBox来调用输出结果
    invoke ExitProcess,NULL
   
end start

;--------------------------
;【2】
;--------------------------
;------------------------------------
;程序功能:计算1+2+3+4..+100 的结果
; 将其结果用MessageBox打印到屏幕上
;------------------------------------
.386
.model flat,stdcall
option casemap:none
;------Include 文件定义--------------
includewindows.inc
includeuser32.inc
includelib user32.lib
includekernel32.inc
includelib kernel32.lib

;----Data Segment------------
.data
dwSum   dd 0    ;计算和,最终的结果
dwCount   dd 0    ;计数器,从1开始到100结束
szCaption      db '正在计算1+2+..+100..',0
szResult   db'结果为: %d',0;显示为整形结果。wspintf缓冲区的一个参数,下面要用到
szBuffer   db128 dup(0)
;-----Code Segment----------
.code
;********************计算结果子程序******************
_Result proc
      xor eax,eax    ;清零
   
   .while TRUE
      inc eax   ;eax==1
      add dwSum,eax   ;结果为1
      mov dwCount,eax;dwCount==1
   .break .if (eax>=100);注意,判断条件在这了!
      .endw
   ret
   
_Result endp   
   
start:   call _Result
invoke wsprintf,addr szBuffer,addr szResult,dwSum   ;将结果参数保存到缓冲区
invoke MessageBox,NULL,addr szBuffer,addr szCaption,MB_OK or MB_ICONINFORMATION;以便MessageBox来调用输出结果
    invoke ExitProcess,NULL
   
end start

;--------------------------
;【3】
;--------------------------
;------------------------------------
;程序功能:计算1+2+3+4..+100 的结果
; 将其结果用MessageBox打印到屏幕上
;------------------------------------
.386
.model flat,stdcall
option casemap:none
;------Include 文件定义--------------
includewindows.inc
includeuser32.inc
includelib user32.lib
includekernel32.inc
includelib kernel32.lib

;----Data Segment------------
.data
dwSum   dd 0    ;计算和,最终的结果
dwCount   dd 0    ;计数器,从1开始到100结束
szCaption      db '正在计算1+2+..+100..',0
szResult   db'结果为: %d',0;显示为整形结果。wspintf缓冲区的一个参数,下面要用到
szBuffer   db128 dup(0)
;-----Code Segment----------
.code
;********************计算结果子程序******************
_Result proc
      xor eax,eax    ;清零
   
   .while (eax != 100)   ;条件成立么?<<------
      inc eax   ;eax==1                                          |
      add dwSum,eax   ;结果为1                           |
      mov dwCount,eax;dwCount==1               |
      .continue   ;直接跳到循环头部开始执行      -
      .endw
   ret
   
_Result endp   
   
start:   call _Result
invoke wsprintf,addr szBuffer,addr szResult,dwSum   ;将结果参数保存到缓冲区
invoke MessageBox,NULL,addr szBuffer,addr szCaption,MB_OK or MB_ICONINFORMATION;以便MessageBox来调用输出结果
    invoke ExitProcess,NULL
   
end start

;--------------------------
;【4】
;--------------------------
;------------------------------------
;程序功能:计算1+2+3+4..+100 的结果
; 将其结果用MessageBox打印到屏幕上
;------------------------------------
.386
.model flat,stdcall
option casemap:none
;------Include 文件定义--------------
includewindows.inc
includeuser32.inc
includelib user32.lib
includekernel32.inc
includelib kernel32.lib

;----Data Segment------------
.data
dwSum   dd 0    ;计算和,最终的结果
dwCount   dd 0    ;计数器,从1开始到100结束
szCaption      db '正在计算1+2+..+100..',0
szResult   db'结果为: %d',0;显示为整形结果。wspintf缓冲区的一个参数,下面要用到
szBuffer   db128 dup(0)
;-----Code Segment----------
.code
;********************计算结果子程序******************
.code
_Result proc
      xor eax,eax    ;清零
   .repeat   ;先执行循环体
      inc eax   ;eax==1
      add dwSum,eax   ;和为1
      mov dwCount,eax;dwCount==1
      
   .until dwCount>=100   ;条件判断到这了!
   ret
_Result endp   
   
start:   call _Result
invoke wsprintf,addr szBuffer,addr szResult,dwSum       ;将结果参数保存到缓冲区
invoke MessageBox,NULL,addr szBuffer,addr szCaption,MB_OK or MB_ICONINFORMATION    ;以便MessageBox来调用输出结果
    invoke ExitProcess,NULL
   
end start

;--------------------------
;【5】
;--------------------------
;------------------------------------
;程序功能:计算1+2+3+4..+100 的结果
; 将其结果用MessageBox打印到屏幕上
;------------------------------------
.386
.model flat,stdcall
option casemap:none
;------Include 文件定义--------------
includewindows.inc
includeuser32.inc
includelib user32.lib
includekernel32.inc
includelib kernel32.lib

;----Data Segment------------
.data
dwSum   dd 0    ;计算和,最终的结果
dwCount   dd 0    ;计数器,从1开始到100结束
szCaption      db '正在计算1+2+..+100..',0
szResult   db'结果为: %d',0;显示为整形结果。wspintf缓冲区的一个参数,下面要用到
szBuffer   db128 dup(0)
;-----Code Segment----------
.code
;********************计算结果子程序******************
_Result proc
      xor eax,eax    ;清零
   cmp eax,100    ;比较
   je ResultEQ
   
      NotEQ:   ;不相等时执行循环
      inc eax
      add dwSum,eax
      mov dwCount,eax
      cmp eax,100
      jne NotEQ
ResultEQ:
    ret
   
_Result endp   
   
start:   call _Result
push dwSum    ;参数进栈
push offset szResult   ;结果进栈
push offset szBuffer   ;缓冲区进栈
call wsprintf   ;调用wsprintf函数

push MB_OK or MB_ICONINFORMATION ;MessageBox相关参数进栈
push offset szCaption
push offset szBuffer
push NULL
call MessageBox    ;调用MessageBox函数

push NULL    ;调用ExitProcess函数退出进程
call ExitProcess
   
end start

结果如图:                                                                           

头哥 发表于 2012-11-13 05:32:40

汇编写的真长

s0512 发表于 2012-11-13 07:38:46

楼主给力。。俺要加油了

Exc.Spirit 发表于 2012-11-13 08:28:42

学习了啊...

MrXu404013092 发表于 2012-11-13 09:32:45

楼主很给力啊,学习

我偷月亮的心 发表于 2012-11-13 09:56:27

汇编写的真长

乱闯 发表于 2012-11-13 20:59:24

:D楼主、、、顶顶

A$A#A@ 发表于 2012-11-13 22:06:19

顶顶顶,楼主是吾等的榜样。
页: [1]
查看完整版本: 发个外女贴,示关注!Win32 汇编实现 从1加到100的五种写法