鱼C论坛

 找回密码
 立即注册
查看: 2504|回复: 7

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

[复制链接]
发表于 2012-11-13 02:57:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

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

;------------------------------------
;【1】   
;------------------------------------
;程序功能:计算1+2+3+4..+100 的结果
; 将其结果用MessageBox打印到屏幕上
;------------------------------------
.386
.model flat,stdcall
option casemap:none
;------Include 文件定义--------------
include  windows.inc
include  user32.inc
includelib user32.lib
include  kernel32.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   db  128 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 文件定义--------------
include  windows.inc
include  user32.inc
includelib user32.lib
include  kernel32.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   db  128 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 文件定义--------------
include  windows.inc
include  user32.inc
includelib user32.lib
include  kernel32.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   db  128 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 文件定义--------------
include  windows.inc
include  user32.inc
includelib user32.lib
include  kernel32.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   db  128 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 文件定义--------------
include  windows.inc
include  user32.inc
includelib user32.lib
include  kernel32.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   db  128 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

结果如图:                                                                            1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-13 05:32:40 | 显示全部楼层
汇编写的真长
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-13 07:38:46 | 显示全部楼层
楼主给力。。俺要加油了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-13 08:28:42 | 显示全部楼层
学习了啊  ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-13 09:32:45 | 显示全部楼层
楼主很给力啊,学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-13 09:56:27 | 显示全部楼层
汇编写的真长
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-13 20:59:24 | 显示全部楼层
:D楼主、、、顶顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-13 22:06:19 | 显示全部楼层
顶顶顶,楼主是吾等的榜样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 02:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表