学 Win32 汇编[15]: LOOP 与标号


Loop 是反复执行;
从哪反复? 这要用到 "标号";
反复几次? 把反复的次数告诉 ECX 寄存器即可.

笨办法计算 3 * 8 = 24
; Test15_1.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    val dd 3.codemain proc    xor eax, eax    add eax, val    add eax, val    add eax, val    add eax, val    add eax, val    add eax, val    add eax, val    add eax, val    PrintDec eax  ;24    retmain endpend main

使用 LOOP 和标号:
; Test15_2.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    val dd 3.codemain proc    xor eax, eax    mov ecx, 8L1:               ;命名为 "L1" 的标号    add eax, val    loop L1       ;反复到指定标号; 每次反复 ecx 会减 1, 直到 ecx 为 0 才向下执行    PrintDec eax  ;24    retmain endpend main

数组求和的例子:
; Test15_3.asm.386.model flat,  stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib    .data    dwArr dd 1,2,3,4,5.codemain proc    lea edi, dwArr           ;把数组起始地址给一个寄存器    mov ecx, lengthof dwArr  ;把数组元素数(将要反复的次数)给 ECX    xor eax, eaxL1:    add  eax, [edi]          ;edi 中的地址将不断变化, 通过 [edi] 获取元素值    add  edi, type dwArr     ;获取下一个元素的地址    loop L1        PrintDec eax  ;15    retmain endpend main

复制字符串的例子:
; Test15_4.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib    .data    szSource db 'Hello World!', 0       ;定义源字符串    szDest   db sizeof szSource dup(0)  ;定义相同大小的目的字符串.codemain proc    mov  esi, 0                ;这里选择使用 esi 做数组索引    mov  ecx, sizeof szSource  ;这是要循环的次数L1:    mov  al, szSource[esi]     ;mov 的操作数不允许两个都是变量, 用 al 中转一下    mov  szDest[esi], al       ;    inc  esi                   ;调整索引    loop L1        PrintString szDest         ;Hello World!    retmain endpend main

如果仅仅是复制字符串, 可以使用声明在 masm32.inc 中的 szCopy 函数:
; Test15_5.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib    .data    szSource db 'Hello World!', 0    szDest   db sizeof szSource dup(0).codemain proc    invoke szCopy, addr szSource, addr szDest    PrintString szDest  ;Hello World!    retmain endpend main

关于 @@、@B、@F:
; 如果懒得给标号取名, 可以使用 @@ 做标号;; @B 表示前面最近的一个标号、@F 表示后面最近的一个标号;; 使用 @@ 可以把前面 3*8=24 的例子修改如下:; Test15_6.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    val dd 3.codemain proc    xor eax, eax    mov ecx, 8@@:    add eax, val    loop @B    PrintDec eax  ;24    retmain endpend main

关于全局标号:
; 上面例子中的标号都是局部标号;; 如果一个标号定义在子过程之外, 那它就是全局标号了.; 能不能在子过程中定义全局标号呢? 后面加两个 : 就是了.; Test15_7.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    val dd 3.codeMyProc procLabel1::               ;是 Label1:: 而不是 Label1:    PrintText 'MyProc'    retMyProc endpmain proc    PrintText 'main'    jmp Label1  ;jmp 是无条件跳转指令    retmain endpend main

posted on 2010-04-08 17:02 万一 阅读(2655) 评论(1) 编辑 收藏©著作权归作者所有:来自51CTO博客作者JLee79的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 0425PHP编程作业
  2. php入门之 js数组遍历与php的区别
  3. C语言中易错的地方(一)
  4. 冷月手撕408之数据结构(3)-顺序表
  5. 210406 类数组 获取遍历DOM元素 向元素添加文本 获取元素的自定
  6. PHP:实例演示PHP模块加载和JavaScript和PHP中for/forEach两种语
  7. 【php基础入门】PHP环境搭建与初识php代码书写及演示PHP和JS中遍
  8. 4.07字符串与数组的一些常用方法
  9. (lintcode)第6题 合并排序数组

随机推荐

  1. android JNI 学习笔记1
  2. Android深入理解Context--Service中Conte
  3. android捕获全局异常处理,不闪退
  4. Android中如何处理Sqlite查询结果中的NUL
  5. Android 性能优化笔记 一 布局优化
  6. android selector下的属性值
  7. android 获得当前view在屏幕的坐标
  8. android三种动画详解
  9. Android:简单的webView与js交互
  10. Android全屏