`
zzc1684
  • 浏览: 1193063 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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



笨办法计算 3 * 8 = 24


; Test15_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    val dd 3
.code
main 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
    ret
main endp
end main


使用 LOOP 和标号:


; Test15_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    val dd 3
.code
main proc
    xor eax, eax
    mov ecx, 8
L1:               ;命名为 "L1" 的标号
    add eax, val
    loop L1       ;反复到指定标号; 每次反复 ecx 会减 1, 直到 ecx 为 0 才向下执行

    PrintDec eax  ;24
    ret
main endp
end main


数组求和的例子:


; Test15_3.asm
.386
.model flat,  stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
    
.data
    dwArr dd 1,2,3,4,5
.code
main proc
    lea edi, dwArr           ;把数组起始地址给一个寄存器
    mov ecx, lengthof dwArr  ;把数组元素数(将要反复的次数)给 ECX
    xor eax, eax
L1:
    add  eax, [edi]          ;edi 中的地址将不断变化, 通过 [edi] 获取元素值
    add  edi, type dwArr     ;获取下一个元素的地址
    loop L1
    
    PrintDec eax  ;15
    ret
main endp
end main


复制字符串的例子:


; Test15_4.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
    
.data
    szSource db 'Hello World!', 0       ;定义源字符串
    szDest   db sizeof szSource dup(0)  ;定义相同大小的目的字符串
.code
main 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!
    ret
main endp
end main


如果仅仅是复制字符串, 可以使用声明在 masm32.inc 中的 szCopy 函数:


; Test15_5.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
    
.data
    szSource db 'Hello World!', 0
    szDest   db sizeof szSource dup(0)
.code
main proc
    invoke szCopy, addr szSource, addr szDest
    PrintString szDest  ;Hello World!
    ret
main endp
end main


关于 @@、@B、@F:



; 如果懒得给标号取名, 可以使用 @@ 做标号;
; @B 表示前面最近的一个标号、@F 表示后面最近的一个标号;
; 使用 @@ 可以把前面 3*8=24 的例子修改如下:

; Test15_6.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    val dd 3
.code
main proc
    xor eax, eax
    mov ecx, 8
@@:
    add eax, val
    loop @B
    PrintDec eax  ;24
    ret
main endp
end main


关于全局标号:



; 上面例子中的标号都是局部标号;
; 如果一个标号定义在子过程之外, 那它就是全局标号了.
; 能不能在子过程中定义全局标号呢? 后面加两个 : 就是了.

; Test15_7.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    val dd 3
.code

MyProc proc
Label1::               ;是 Label1:: 而不是 Label1:
    PrintText 'MyProc'
    ret
MyProc endp

main proc
    PrintText 'main'
    jmp Label1  ;jmp 是无条件跳转指令
    ret
main endp
end main
分享到:
评论

相关推荐

    WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编

    WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编WIN32汇编

    Win32汇编 Win32汇编

    Win32汇编 Win32汇编 Win32汇编 Win32汇编

    win32汇编语言入门win32汇编语言入门

    win32汇编语言入门win32汇编语言入门win32汇编语言入门win32汇编语言入门win32汇编语言入门win32汇编语言入门

    学习win32汇编-初级入门

    Win32应用程序虽然和其他32位应用程序(例如32位保护模式DOS程序)一样可以使用386汇编语言和保护模式编程,但是Win32应用程序的执行机制与其他32位应用程序有一定的差别,例如消息循环、动态链接等,Win32汇编语言...

    win32汇编教程

    win32汇编教程。汇编基础。 本帮助文件由yyc个人整理后出版,内容全摘自网络。版权归实际作者所有。 为了让网友们能更好的学习Win32汇编编程,于是我为大家将网上的资料整理成一个帮助文件。 本帮助文件包括:...

    Win32汇编程序设计教程

    Win32汇编编程系列 声明: 本帮助文件由yyc个人整理后出版,内容全摘自网络。版权归实际作者所有。 为了让网友们能更好的学习Win32汇编编程,于是我为大家将网上的资料整理成一个帮助文件。 本帮助文件包括:...

    WIN32汇编程序源码级调试_VS2019_vs2019win32汇编_vs2019win32汇编_Win32汇编程序_汇编语言

    汇编语言下的windows窗口代码,学生管理系统

    从Dos到Win32汇编从Dos到Win32汇编[评价可免费]

    从Dos到Win32汇编从Dos到Win32汇编从Dos到Win32汇编从Dos到Win32汇编

    罗云斌win32汇编.rar

    ”这个简单的例子开始到编写多线程、注册表和网络通信等复杂的程序,通过60多个实例逐渐深入Win32汇编语言的方方面面。本书作者罗云彬拥有十余年汇编语言编程经验,是汇编编程网站http://asm.yeah.net和汇编编程论坛...

    WIN32汇编语言教程

    WIN32汇编语言教程 电子书WIN32汇编语言教程 电子书WIN32汇编语言教程 电子书WIN32汇编语言教程 电子书WIN32汇编语言教程 电子书WIN32汇编语言教程 电子书

    win32汇编程序设计教程

    ”这个简单的例子开始到编写多线程、注册表和网络通信等复杂的程序,通过60多个实例逐渐深入Win32汇编语言的方方面面。本书作者罗云彬拥有十余年汇编语言编程经验,是汇编编程网站http://asm.yeah.net和汇编编程论坛...

    Win32汇编语言程序设计(罗云彬)chm

    ”这个简单的例子开始到编写多线程、注册表和网络通信等复杂的程序,通过60多个实例逐渐深入Win32汇编语言的方方面面。本书作者罗云彬拥有十余年汇编语言编程经验,是汇编编程网站http://asm.yeah.net和汇编编程论坛...

    Win32汇编语言编程(罗云彬编)

    ”这个简单的例子开始到编写多线程、注册表和网络通信等复杂的程序,通过60多个实例逐渐深入Win32汇编语言的方方面面。本书作者罗云彬拥有十余年汇编语言编程经验,是汇编编程网站http://asm.yeah.net和汇编编程论坛...

    Win32汇编语言教程

    Win32汇编语言教程

    win32汇编语言实现冒泡排序

    win32汇编语言实现冒泡排序,全部的代码插入在文档的最下面。

    win32汇编工具打包

    win32汇编打包 工具 demo实例

    Win32汇编教程.pdfWin32汇编教程.pdf

    Win32汇编教程.pdfWin32汇编教程.pdfWin32汇编教程.pdfWin32汇编教程.pdf

    win32汇编语言教程

    Win32汇编编程系列 声明: 本帮助文件由yyc个人整理后出版,内容全摘自网络。版权归实际作者所有。 为了让网友们能更好的学习Win32汇编编程,于是我为大家将网上的资料整理成一个帮助文件。 本帮助文件包括:...

    Win10系统VS2022开发环境中X86Win32汇编MASM32环境配置和一些.docx

    Win10系统VS2022开发环境中X86Win32汇编MASM32环境配置和一些.docx

    win32汇编语言教程.chm

    win32汇编语言教程.chm win32汇编语言教程

Global site tag (gtag.js) - Google Analytics