• 汇编-间接寻址(处理数组)


    直接寻址很少用于数组处理,因为用常数偏移量来寻址多个数组元素时,直接寻址并不实用。取而代之的是使用寄存器作为指针(称为间接寻址(indirect addressing) ) 并控制该寄存器的值。如果一个操作数使用的是间接寻址, 就称之为间接操作数(indie ct operand) 。
     

    间接操作数

    保护模式下任何一个32位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP及ESP) 用中括号括起来就成为间接操作数。寄存器中包含的是数据的地址
     

    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. .data
    5. byteVal BYTE 10h
    6. ExitProcess PROTO,dwExitCode:DWORD
    7. .code
    8. main PROC
    9. mov esi, OFFSET byteVal
    10. mov al, [esi] ;AL=10h,[esi]表示esi地址中的数据
    11. INVOKE ExitProcess,0
    12. main ENDP
    13. END main

    如果目的操作数使用间接寻址,则新值将存入由寄存器指向的内存位置。

    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. .data
    5. byteVal BYTE 10h
    6. ExitProcess PROTO,dwExitCode:DWORD
    7. .code
    8. main PROC
    9. mov bl,88h
    10. mov esi , OFFSET byteVal
    11. mov [esi],bl ;把bl中的值存入esi表示的地址中
    12. mov al,[esi] ;al=88h
    13. INVOKE ExitProcess,0
    14. main ENDP
    15. END main

    PTR与间接操作数一起使用

    PTR与间接操作数一起使用一个操作数的大小可能无法从指令的上下文直接看出来。

    下面的指令会导致汇编器产生“operand must have size”(操作数必须有大小) 的报错消息:

    inc [esi]

    汇编器不知道ESI指向的是字节、字、双字, 或其他数据大小。

    PTR操作符则可以确定操作数的大小,如下例所示:

    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. .data
    5. val BYTE 12h
    6. ExitProcess PROTO,dwExitCode:DWORD
    7. .code
    8. main PROC
    9. mov esi,OFFSET val
    10. inc BYTE PTR [esi] ;指明BYTE大小
    11. mov eax,[esi] ;EAX = 00000013
    12. INVOKE ExitProcess,0
    13. main ENDP
    14. END main


     


     

  • 相关阅读:
    Kubernetes 进阶训练营 控制器
    C++初阶之入门
    python 异步Web框架sanic
    【Java】反射是什么?
    Linux下修改jar包中的配置文件application.conf
    牛客TOP101-BM51
    oh-my-zsh 为 ls 命令自定义颜色
    利用pymupdf编辑修改pdf
    算法笔记—多数相加
    【C语言】【结构体的内存对齐】计算结构体内存大小,有图解
  • 原文地址:https://blog.csdn.net/lm68140318/article/details/134473636