`
zzc1684
  • 浏览: 1222547 次
  • 性别: 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汇编程序源码级调试_VS2019_vs2019win32汇编_vs2019win32汇编_Win32汇编程序_汇编语言

    Win32汇编是针对Windows API设计的,它可以创建与Windows操作系统紧密交互的应用程序。这些API函数提供了一系列功能,如窗口管理、内存分配、文件操作等。在汇编语言中使用Win32 API,程序员可以直接控制操作系统,...

    Win32汇编 Win32汇编

    Win32汇编语言是计算机科学的一个重要领域,它是一种低级编程语言,直接与Windows操作系统接口进行交互。在深入探讨之前,让我们先明确一点:Win32汇编并不是一个独立的语言,而是指使用Intel x86架构上的汇编语言来...

    Win32汇编语言教程

    Win32汇编语言与32位保护模式DOS程序的汇编语言有区别,它涉及到Windows操作系统特有的执行机制,如消息循环和动态链接。 **Win32汇编语言的特点和应用** Win32汇编语言允许程序员直接控制硬件资源,提供更高效的...

    win32汇编教程

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

    Win32汇编程序设计教程

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

    Win32汇编教程

    在《Win32汇编教程》中,iczelion详尽地讲解了如何使用汇编语言与Win32 API相结合,创建Windows应用程序。教程内容包括但不限于: 1. **基础篇**:介绍汇编语言的基本概念,如指令集、寄存器、寻址方式等。讲解MASM...

    Iczelion的Win32汇编教程

    Iczelion的Win32汇编教程,传说中的经典win32汇编教程

    Win32汇编教程合集

    压缩包中的"Win32汇编教程合集.chm"文件很可能是一个帮助文档,包含了详细的Win32汇编语言教程,包括基本语法、API调用、内存管理、系统调用、线程与进程控制、异常处理等多个方面。帮助文档通常组织结构清晰,便于...

    win32 汇编 视频教程

    ### Win32汇编语言基础概念 #### 一、Win32编程简介 在深入了解Win32汇编视频教程之前,我们首先需要了解Win32编程的基本概念。Win32是一套由微软提供的应用程序编程接口(API),它主要用于编写Windows操作系统下...

    罗云彬win32汇编教程

    作者罗云彬以其深入浅出的讲解风格,为读者揭示了Win32汇编语言的魅力与精髓。这本书旨在帮助读者理解计算机底层运作机制,掌握在Windows环境下使用汇编语言进行程序设计的技术。 Win32汇编是微软为Windows操作系统...

    x86 win32汇编学习代码(源码)

    《x86 Win32汇编学习代码》是一份针对初学者和进阶者精心整理的汇编语言学习资源,包含40至50个独立的代码实例。这些实例覆盖了x86架构下的Win32汇编语言的各个方面,旨在帮助读者深入理解汇编语言的精髓,并通过...

    win32汇编工具打包

    在Windows 32位环境下,汇编语言被称为Win32汇编,主要用于编写系统级程序、驱动程序或者对性能有严格要求的代码。本教程将深入探讨Win32汇编工具及其打包过程,通过示例来帮助理解如何在Windows平台上有效地使用...

    Win32汇编程序设计

    这本书将详细介绍如何在Win32环境下使用汇编语言与API进行交互,包括窗口创建、消息处理、内存管理、文件操作等。 汇编语言的核心在于理解指令集,Win32汇编通常使用x86架构的指令集,包括数据处理、转移控制、输入...

    win32汇编语言入门

    ### Win32汇编语言入门知识点详解 #### 一、为何学习汇编语言? 学习汇编语言对于深入了解计算机系统的工作原理至关重要。它被视为计算机科学领域的一门基础学科,被比喻为计算机软件技术的“原子学说”。理解汇编...

    Win32汇编源码

    Win32汇编源码是计算机编程领域中的一个重要分支,主要关注的是在Windows操作系统环境下,用汇编语言编写程序的方法。汇编语言是一种低级语言,它的指令与计算机硬件的机器语言非常接近,使得程序员可以直接控制...

    win32汇编教程(比较全)

    《win32汇编教程》是一份全面介绍Win32环境下汇编语言编程的资源,适合对汇编语言有兴趣或需要深入理解系统级编程的朋友们学习。本教程以MHT格式提供,MHT是一种单一文件网页格式,包含了网页的所有内容,如文字、...

    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汇编教程》是一部深入讲解Windows平台下汇编语言的经典教程,由知名编程专家罗云彬撰写。本教程以其详尽的内容和深入浅出的讲解方式,深受广大编程爱好者喜爱,是学习Win32汇编语言不可多得的参考资料...

    WIN32汇编语言教程

    在本书中,读者将深入学习如何使用汇编语言编写程序,并了解与之相关的WIN32 API(应用程序接口)。WIN32 API是微软为Windows操作系统提供的编程接口,它包括了一系列函数调用,用于处理窗口、图形绘制、文件操作等...

Global site tag (gtag.js) - Google Analytics