汇编语言直接偏移量操作数

变量名加上一个位移就形成了一个直接 – 偏移量操作数。这样可以访问那些没有显式标记的内存位置。假设现有一个字节数组 arrayB:

arrayB BYTE 10h,20h,30h,40h,50h

用该数组作为 MOV 指令的源操作数,则自动传送数组的第一个字节:

mov al,arrayB          ;AL = 10h

通过在 arrayB 偏移量上加 1 就可以访问该数组的第二个字节:

mov al,[arrayB+1]            ;AL = 20h

如果加 2 就可以访问该数组的第三个字节:

mov al, [arrayB+2]           ;AL = 30h

形如 arrayB+1 一样的表达式通过在变量偏移量上加常数来形成所谓的有效地址。有效地址外面的括号表明,通过解析这个表达式就可以得到该内存地址指示的内容。汇编器并不要求在地址表达式之外加括号,但为了清晰明了,建议使用括号。

MASM 没有内置的有效地址范围检查。在下面的例子中,假设数组 arrayB 有 5 个字节,而指令访问的是该数组范围之外的一个内存字节。其结果是一种难以发现的逻辑错误,因此,在检查数组引用时要非常小心:

mov al, [arrayB+20]               ; AL = ??

字和双字数组

在 16 位的字数组中,每个数组元素的偏移量比前一个多 2 个字节。这就是为什么在下面的例子中,数组 ArrayW 加 2 才能指向该数组的第二个元素:

  .data  arrayW WORD 100h,200h,300h  .code  mov ax, arrayW                               ;AX = 100h  mov ax,[arrayW+2]                            ;AX = 200h

同样,如果是双字数组,则第一个元素偏移量加 4 才能指向第二个元素:

  .data  arrayD DWORD l0000h,20000h  .code  mov eax, arrayD 

4.1 操作数类型
4.2 MOV指令
4.3 MOVZX和MOVSX指令
4.4 LAHF和SAHF指令
4.5 XCHG指令
4.6 直接偏移量操作数
4.7 汇编语言数据传送示例
4.8 加法和减法详解
4.9 OFFSET运算符
4.10 ALIGN伪指令
4.11 PTR运算符
4.12 TYPE运算符
4.13 LENGTHOF运算符
4.14 LABEL伪指令
4.15 间接寻址
4.16 JMP和LOOP指令
4.17 64位MOV指令
4.18 64位加法和减法

猜你喜欢

转载自blog.csdn.net/Javaxuxuexi/article/details/93401535