首页 > 编程语言 >汇编语言简易教程(8):寻址模式

汇编语言简易教程(8):寻址模式

时间:2024-04-12 12:12:53浏览次数:24  
标签:教程 汇编语言 mov eax lst 寻址 内存 寄存器

汇编语言简易教程(8):寻址模式

寻址模式是使用正在访问(读取或写入)的数据项的地址来访问内存中的值的受支持方法。这可能包括变量的名称或数组中的位置。

基本的寻址模式包含:

  1. 寄存器
  2. 立即数
  3. 内存

寻址注意事项

使用[]

需要注意: 访问内存的唯一方法是使用方括号([]'s)。省略括号将不会访问内存,而是获取项目的地址.

image

如上所示, 由于省略括号不是错误,因此汇编器不会生成错误消息或警告

当访问内存时,很多情况下操作数的大小是明确的。例如,指令mov eax, [rbx]

从内存中移动一个双字。然而,对于某些指令来说,大小可能不明确, 例如 inc [rbx]​是不明确的,因为不清楚正在访问的内存是字节、字还是双字。在这种情况下,必须使用字节、字或双字、四字大小限定符指定操作数大小. 所以我们需要使用

inc		byte [rbx]
inc		word [rbx]
inc		dword [rbx]

在这种情况下,必须使用字节、字或双字、四字大小限定符指定操作数大小.

寄存器寻址

寄存器模式寻址指的是操作对象是一个寄存器(eax, ebx, etc.)

例如: mov eax, ebx​, 其中 eax​, ebx​都是寄存器模式寻址.

立即数寻址

寄存器模式寻址指的是操作对象是一个立即数.

例如: mov eax, 123​, 其中 eax​是寄存器模式寻址, 123是立即数寻址

内存寻址

内存寻址意味着操作数是内存中的一个位置(通过地址访问)。这称之为间接引用 或者 解引用.

内存模式寻址的最基本形式已在前一章中广泛使用。

例如: mov rax, qword [qNum]

将访问变量 qNum 的内存位置并检索存储在那里的值。

这要求 CPU 在完成操作之前等待直到检索到该值,因此可能比使用立即值的类似操作花费稍长的时间来完成。

访问数组时,需要更通用的方法。具体来说,地址可以放置在寄存器中,并使用寄存器(而不是变量名称)执行间接寻址

举例

lst dd 101, 103, 105, 107

其内存分布如下图:

image

第一个元素的访问可以使用: mov eax, dword [lst]

除此之外, 还可以通过: mov rbx, lst mov eax, dword [rbx]

在此示例中,列表的起始地址或基地址被放置在 rbx(第一行)中,然后访问该地址处的值并将其放置在 rax 寄存器(第二行)中。这使我们可以轻松访问数组中的其他元素

回想一下,内存是“字节可寻址的”,这意味着每个地址都是一个字节的信息。双字变量为 32 位或 4 个字节,因此每个数组元素使用 4 个字节的内存。这样,下一个元素(103)就是起始地址(lst)加4,下一个元素(105)就是起始地址(lst)8

对于每个连续元素,将偏移量增加 4。字节列表将增加 1,字列表将增加 2,双字列表将增加 4,四字列表将增加 8。

偏移量是添加到基地址的量。索引是高级语言中使用的数组元素号。

有多种方法可以访问数组元素。一种是使用基地址并添加位移。例如,给定初始化:

mov		rbx, lst
mov		rsi, 8

以下每条指令都访问第三个元素(上面列表中的 105)

  1. mov eax, dword [lst + 8]
  2. mov eax, dword [rbx + 8]
  3. mov eax, dword [lst + rsi]

在每种情况下,都会访问起始地址加 8,并将值 105 放入 eax 寄存器中。添加位移并访问内存位置,同时不更改任何源操作数寄存器(rbx、rsi)。具体使用什么方法由程序员决定

位移计算

此外,位移可以用更复杂的方式计算

[ baseAddr + (indexReg * scaleValue ) + displacement ]

  1. 其中baseAddr是寄存器或变量名。
  2. indexReg 必须是一个寄存器。
  3. ThescaleValue 是立即值 1, 2, 4, 8(1 是合法的,但没有用)。
  4. displacement ​必须是立即值。
  5. 结果代表一个64位地址

元素可以任意组合使用,但必须合法并产生有效地址

一些示例:

image

由于地址始终是 qword(在 64 位架构上),因此使用 64 位寄存器进行内存模式寻址(即使在访问双字值时也是如此)。这使得寄存器的使用更像是数组索引(来自高级语言)。

例如,内存操作数[lst+rsi*4]​类似于高级语言中的 lst[rsi]​。 rsi 寄存器乘以数据大小(本例中为 4,因为每个元素都是 4 字节)

示例程序

计算列表之和

section .data; -----
;  Define constants
EXIT_SUCCESS    equ    0; successful operation
SYS_exit        equ    60; call code for terminate
; -----
; Define Data.
section .data
    lst dd  1002, 1004, 1006, 1008, 10010
    len dd  5
    sum dd  0
; ********************************************************
section .text
global_start
_start:
; -----
; Summation loop.
    mov ecx, dword [len]; get length value
    mov rsi, 0; index=0

sumLoop:
    mov eax, dword [lst+(rsi*4)]; get lst[rsi]
    add dword [sum], eax; update sum
    inc rsi; next item
    loop    sumLoop
    ; -----
    ;  Done, terminate program.
last:
    mov rax, SYS_exit; call code for exit
    mov rdi, EXIT_SUCCESS; exit with successsyscall

[ ]内的 () 不是必需的,添加只是为了清楚起见。因此,[lst+(rsi*4)] [lst+rsi*4]​ 完全相同。

标签:教程,汇编语言,mov,eax,lst,寻址,内存,寄存器
From: https://www.cnblogs.com/pDJJq/p/18130903/simple-tutorial-of-assembly-language-8-addressing

相关文章

  • 汇编语言简易教程(9):程序栈
    汇编语言简易教程(9):程序栈在计算机中,栈是一种数据结构,其中项目以相反的顺序添加,然后从栈中删除。也就是说,最近添加的项目是第一个被删除的项目。这通常称为后进先出(LIFO).堆栈在编程中大量使用,用于在过程函数调用期间存储信息。下一章提供有关堆栈的信息和示例将项目添加......
  • Visual Studio Code & Python教程2环境
    2简介本章将使用简单的编程概念来修改基本的Python程序和VSCode功能,如任务运行、编辑默认设置、了解键盘快捷键和运行Python程序。我们必须做的第一件事是建立一个工作的开发环境。我们将从安装Python和安装VS代码开始,然后设置Python环境。本章的第二部分是了解全局......
  • Java中Array.sort()的几种用法简明教程 (需要初始化要排序的对象)对 一个数组的所有元素
    Java中Array.sort()的几种用法简明教程(需要初始化要排序的对象)对一个数组的所有元素进行排序,并且是按从小到大的顺序Java中Array.sort()的几种用法简明教程(需要初始化要排序的对象)======================================================1、Arrays.sort(int[]a)......
  • 格式化HTML代码 ,美化JS代码教程
    直接上地址美化HTMLhttps://htmlformatter.com/美化JShttps://beautifier.io/1.美化HTML使用教程把html代码输入到代码框点击format然后等待格式化然后点击Download下载按钮2.美化JS使用教程把代码输入到代码框点击右边的BeautifyJavascript按钮,选择美化代码的种......
  • 最好用的Python IDE,pycharm保姆级安装教程
    简介由于Python语法简单容易入门,并且Python在办公自动化等领域的功能非常强大,所以现在越来越多非IT行业的人也开始学起了Python,要学习和使用一门编程语言,一个好用的IDE是必不可少的,而对于Python来说,最好的IDE无疑是Pycharm。本文就给大家介绍一下如何从零到一来安装Pycharm。下......
  • 抓包神器wireshark安装保姆级教程
    简介当我们进行网络抓包时,我们通常需要借助其他的工具进行抓取,比如Charles,fiddler等,今天我们给大家介绍一款同样非常流行的抓包工具——wireshark,本文将介绍wireshark的安装以及简单的抓包。wireshark安装下载安装之前,我们首先需要下载安装包,下载网址:https://www.wireshark......
  • 从零基础到精通,抓包神器fiddler保姆级使用教程(一)
    Fiddler介绍以及安装Fiddler简介Fiddler是比较好用的web代理调试工具之一,它能记录并检查所有客户端与服务端的HTTP/HTTPS请求,能够设置断点,篡改及伪造Request/Response的数据,修改hosts,限制网速,http请求性能统计,简单并发,接口测试,辅助自动化测试,等等。现在抓包工具成为测试人员的必......
  • 关于Layui的多层级的下拉选项Select使用教程
    案例代码<selectname="parentSelect"lay-filter="parentSelect"><optionvalue="">请选择父级选项</option><optionvalue="1">父级选项1</option>......
  • 【教程】四种方法将App打包为IPA文件类型
     摘要本教程总结了将App应用程序打包为IPA包的四种常用方法,包括Apple推荐的方式、iTunes拖入方法、自动编译脚本和解压改后缀名方法。每种方法都有其特点和适用场景,在实际开发中可以根据需求选择合适的方式进行打包。通过本教程,您将了解到不同打包方式的优缺点,并学会如何利用脚......
  • 【教程】MuMu模拟器HTTPS抓包实践
    ✨所需工具MuMu模拟器:https://mumu.163.com/Charles:https://www.charlesproxy.com/OpenSSL:https://slproweb.com/products/Win32OpenSSL.html✨签发证书下载安装Charles(需要学习版请点击)Help>SSLProxying>SaveCharlesRootCertificate导出证书,命名为charles.pe......