• 汇编语言定使用WHILE、REPEAT、FOR 和 FORC伪指令定义重复语句块

    MASM 有许多循环伪指令用于生成重复的语句块:WHILE、REPEAT、FOR 和 FORC。与 LOOP 指令不同,这些伪指令只在汇编时起作用,并使用常量值作为循环条件和计数器:

    • WHILE 伪指令根据一个布尔表达式来重复语句块。
    • REPEAT 伪指令根据计数器的值来重复语句块。
    • FOR 伪指令通过遍历符号列表来重复语句块。
    • FORC 伪指令通过遍历字符串来重复语句块。

    WHILE 伪指令

    WHILE 伪指令重复一个语句块,直到特定的常量表达式为真。其语法如下:

    WHILE constExpression
        statements
    ENDM

    下面的代码展示了如何在 1 到 F000 0000h 之间生成斐波那契 (Fibonacci) 数,作为汇编时常数序列:

    .data
    val1 = 1
    val2 = 1
    DWORD val1                   ;前两个值
    DWORD val2
    val3 = val1 + val2
    WHILE val3 LT 0F0000000h
        DWORD val3
        val1 = val2
        val2 = val3
        val3 = val1 + val2
    ENDM

    REEPEAT 伪指令

    在汇编时,REPEAT 伪指令将一个语句块重复固定次数。其语法如下:

    REPEAT constExpression
        statements
    ENDM

    constExpression 是一个无符号整数常量表达式,用于确定重复次数。

    在创建数组时,REPEAT 的用法与 DUP 类似。在下面的例子中,WeatherReadings 结构含有一个地点字符串和一个包含了降雨量与湿度读数的数组:

    WEEKS_PER_YEAR = 52
        WeatherReadings STRUCT
        location BYTE 50 DUP(0)
        REPEAT WEEKS_PER_YEAR
            LOCAL rainfall, humidity
            rainfall DWORD ?
            humidity DWORD ?
        ENDM
    WeatherReadings ENDS

    由于汇编时循环会对降雨量和湿度重定义,使用 LOCAL 伪指令可以避免因其导致的错误。

    FOR 伪指令

    FOR 伪指令通过迭代用逗号分隔的符号列表来重复一个语句块。列表中的每个符号都会引发循环的一次迭代过程。其语法如下:

    FOR parameter,<arg1,arg2,arg3,...>
        statements
    ENDM

    第一次循环迭代时,parameter 取 arg1 的值,第二次循环迭代时,parameter 取 arg2 的值; 以此类推,直到列表的最后一个实参。

    【示例】现在创建一个学生注册的场景,其中,COURSE 结构含有课程编号和学分值;SEMESTER 结构包含一个有 6 门课程的数组和一个计数器 NumCourses:

    COURSE STRUCT
        Number BYTE 9 DUP(?)
        Credits BYTE ?
    COURSE ENDS
    ;semester 含有一个课程数组。
    SEMESTER STRUCT
        Courses COURSE 6 DUP(<>)
        NumCourses WORD ?
    SEMESTER ENDS

    使用 FOR 循环可以定义 4 个 SEMESTER 对象,每一个对象都从由尖括号括起的符号列表中选择一个不同的名称:

    .data
        FOR semName,<Fall2013, Spring2014, Summer2014, Fall2014>
        semName SEMESTER <>
    ENDM

    如果查看列表文件就会发现如下变量:

    .data
    Fall2013 SEMESTER <>
    Spring2014 SEMESTER <>
    Summer2014 SEMESTER <>
    Fall2014 SEMESTER <>

    FORC 伪指令

    FORC 伪指令通过迭代字符串来重复一个语句块。字符串中的每个字符都会引发循环的一次迭代过程。其语法如下:

    FORC parameter, <string>
        statements
    ENDM

    第一次循环迭代时,parameter 等于字符串的第一个字符,第二次循环迭代时,parameter 等于字符串的第二个字符;以此类推,直到最后一个字符。

    下面的例子创建了一个字符查找表,其中包含了一些非字母字符。注意,< 和 > 的前面必须有文字字符(!)运算符,以防它们违反FORC伪指令的语法:

    Delimiters LABEL BYTE
    FORC code, <@#$%^&*!<!>>
        BYTE "&code"
    ENDM

    生成的数据表如下所示,可以在列表文件中查看:

    00000000  40  1  BYTE  "@"
    00000001  23  1  BYTE  "#"
    00000002  24  1  BYTE  "$"
    00000003  25  1  BYTE  "%"
    00000004  5E  1  BYTE  "^"
    00000005  26  1  BYTE  "&"
    00000006  2A  1  BYTE  "*"
    00000007  3C  1  BYTE  "<"
    00000008  3E  1  BYTE  ">"

    示例:链表

    结合结构声明与 REPEAT 伪指令以指示汇编器创建一个链表的数据结构是相当简单的。链表中的每个节点都含有一个数据域和一个链接域:

更多...

加载中...