如何用汇编语言(ASM)检查“数组的长度”,

2024-01-03

我刚刚开始学习汇编语言。在java中,如果我们有一个数组,我们总是可以使用array.length来获取它的长度。装配中有这样的事情吗?如果是这样,有人可以在这里指导我吗?

Edit:

我很抱歉,我知道程序集没有数组,我试图简化事情。

我的意思是,如果我有一个变量

data DB 1,2,3,5,7,8,9,10

鉴于数据库可以包含任意数量的元素,我如何检查它包含的总变量?

像java一样,使用int数组来存储它

int data = {1,2,3,4,57,8,9,10};

我们只能数据长度找出元素的总量。


回答这个问题的最佳方法是使用 C 示例。在 C 中,有两种方法可以跟踪数组的长度:

  1. 您存储一个变量,告诉您创建数组的时间。
  2. 您可以执行字符串所做的操作,并将最后一个元素设置为 0。然后,您可以实现一个“字符串”长度函数,该函数循环遍历数组,直到找到零。

对于第一个示例,根据您使用的汇编器,您可能可以使用一些技巧。例如,在 nasm 中你可以这样做:

SECTION .data       

msg:    db "Hello World",10,0  ; the 0-terminated string.
len:    equ $-msg              ; "$" means current address.

正如你所看到的,我们使用equ运算符让 nasm 计算当前地址与起始地址之间的差msg它应该等于它的长度。或者,您可以将长度写为数字。

对于第二种情况,您可以轻松编写一个小函数来完成它。粗略地说,如果您:

SECTION .text

global _mystrlen

_mystrlen:

    push    ebp        ; conform to C calling conventions.
    mov     ebp, esp

    xor     eax, eax
    lea     ecx, [esp+8]   ; load the start of the array into ecx
    jecxz   end            ; jump if [ecx] is zero.

loop:
    add     eax, 1     ; could use inc eax as well. 
    add     ecx, 4     ; always increment by (sizeof(int)). Change as appropriate
    mov     edx, [ecx] ; load ecx
    cmp     edx, 0     ; compare with zerp
    je      end        ; if ecx is zero, we're done.
    jmp     loop       ; if ecx isn't zero, loop until it is.

end:
    leave              ; restore stack frame
    ret                ; return. eax is retval

请注意,我还没有测试过。这只是为了给你一个想法。

Edit我已经测试过x86_64Linux 上的版本,使用rdi作为param1,传入int arr[10] = {1,2,3,4,5,6,7,8,9,0};。退货9正如预期的那样。请注意,在 Linux 上,前面的下划线mystrlen是不必要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用汇编语言(ASM)检查“数组的长度”, 的相关文章

  • 在汇编中显示两位数? [复制]

    这个问题在这里已经有答案了 我对汇编编程完全陌生 在课堂作业的示例中 需要将两个数字相加并显示总和 我发现神秘的是当其是两位数时显示总和 这是我的代码 mov al num1 mov bl num2 add al bl add ax 303
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • x86-64 上这个语句有什么问题?

    该函数的目的是获取堆栈的起始地址 unsigned long find start void asm movq rsp eax 当我编译它时 出现错误 Error suffix or operands invalid for movq mo
  • C++ 中的 CPUID 实现

    我想知道这里是否有人有一些可以从任何托管 net 语言引用的 C CPUID 实现的好示例 另外 如果情况并非如此 我是否应该注意 X86 和 X64 之间的某些实现差异 我想使用 CPUID 来获取运行我的软件的机器上的信息 崩溃报告等
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • 如何在程序中将自己缝合到自己的尾部,无限循环地封装 64KB 代码段?

    如果指令的顺序执行经过偏移量 65535 则8086将从同一代码段中的偏移量 0 处获取下一个指令字节 接下来的 COM 程序利用这一事实 不断将其整个代码 总共 32 个字节 缝合到自己的尾部 环绕在 64KB 代码段中 你可以称之为二元
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • 高效memcspn

    有谁知道 memcspn 函数的有效实现吗 它的行为应该类似于 strcspn 但在内存缓冲区中查找跨度 而不是在以 null 结尾的字符串中查找跨度 目标编译器是 VisualC 谢谢 卢卡 一种近乎最佳的实现 size t memcsp

随机推荐

  • 如何在 Windows 中使用正则表达式匹配行尾

    我在 Windows 中创建了一个 txt 文件 现在应该在 Linux 中进行编辑 我想用 grep 匹配行尾 假设我要在文件中找到的行的内容是 foo bar bar 然后我发出命令grep r bar 但没有产生任何输出 在 Wind
  • 多线程 COMObject 和 UI 线程 (C#)

    这是我在这里发表的第一篇文章 因为实际上我通常用很棒的方法解决我所有的问题 您可以在这里找到邮政数据库 但我现在实际上陷入困境 我正在开发一个遵循 MVVM 的项目 其中包括一个 COM 对象 正如我在研究过程中所读到的那样 我了解到 CO
  • 具有多个代理的 Ember CLI

    问题 我有一个 Ember CLI 应用程序 它将使用多个 API 我需要在开发模式下代理这些 API 背景 我有一个遗留的 api 它在以下位置公开服务 api在我的本地开发机器上运行localhost 3000 我有一个新的 api 它
  • 申请家庭内如何分配?

    我有包含多个因素的 data frame 我想重命名所有这些因素的因素级别 例如 mydf lt data frame col1 as factor c A A NA NA col2 as factor c A NA NA A mydf l
  • 不同 Modelica 仿真环境之间有什么区别?

    有不同的 Modelica 仿真环境 包括 Dymola Wolfram SystemModeler OpenModelica 和 Jmodelica 所以 我尝试加载热流体库 ThermoSysProhttps github com Dw
  • 为什么命名元组使用的内存比字典少?

    我问这个是因为我觉得这很令人惊讶 我想namedtuple会有更多的开销 背景是我在内存中缓存了一个大型 Django 查询 发现 Django 对象的大小是 values 然后我想知道什么开销namedtuple对象的版本将是 允许我仍然
  • 从一个 SQS 触发器触发多个 lambda 函数

    我不确定我是否正确理解 AWS Lambda SQS 触发器 我是否可以将其配置为一个 SQS 队列可以根据消息正文或消息属性触发不同的 lambda 函数 我的用例 我有三个不同的 lambda 函数 processCricket pro
  • java.lang.RuntimeException:运行命令获取文件权限时出错:ExitCodeException exitCode=-1073741515

    问题的标题是我在 Windows 10 上安装 Hadoop 2 9 1 时遇到的异常 经过几周的研究 我无法找到我的标题查询的答案 根据我收到的异常 hadoop 进程正在数据目录中查找权限 但我已经在管理员模式下运行 dfs cmd 和
  • 涉及前一行数据的 Python 向量化运算

    我很好地掌握了如何利用 pandas 和 numpy 对整个数据列进行矢量化操作 然而 我遇到了一种我似乎无法矢量化的情况 当计算涉及利用前一行的值来计算当前行时 我必须退回到 for 循环 是否可以对这种事情进行矢量化 这是我的意思的一个
  • MySQL 更改表修改列在具有空值的行处失败

    我有一个大约有 10K 行的表 我正在尝试更改该表 以便该字段fielddelimiter永远不会为空 我正在尝试执行 alter 语句 期望将任何 null 值更改为默认值 但我从 sql 语句中收到错误 alter table merc
  • AJAX 无法在本地主机上运行

    我正在尝试让 AJAX 示例正常工作 但无法使其正常工作 你能在 XAMPP 上正常运行吗 我有三个文件 message txt index html ajaxtest js 当您单击超链接时 它应该会弹出一个包含 message txt
  • 通过 REST API 列出 Azure 虚拟机

    我当前正在尝试以编程方式获取在 Windows Azure 订阅下运行的所有虚拟机的列表 为此 我尝试使用 Azure REST API https management core windows net https management
  • 如何向 PHP 表单添加删除按钮以从 MySQL 表中删除行

    我已将 MySQL 表的结果输出到 HTML 表 在最后一列中 我想添加一个删除选项 该选项调用另一个表单并从 MySQL 表中删除用户 但我似乎无法让它发挥作用 这是我的结果页面代码 table thead thead table
  • 如何使用 Twilio 暖转电话会议?

    我已阅读有关呼叫转接的 Twilio 文档twilio文档 https www twilio com docs voice api conference resource 堆栈溢出 https stackoverflow com quest
  • Bootstrap 弹出框的 Angular 指令

    我为引导弹出窗口编写了自定义指令 但遇到了一些麻烦 这是代码 angular module CommandCenterApp directive bzPopover function compile http commandHelper r
  • Android:ImageView 放大源图像

    我似乎无法让 ImageView 以原始大小显示其源图像 ImageView 看起来像这样
  • Twitter Bootstrap Carousel - 访问当前索引

    如何从轮播中获取当前索引 在本例中 我使用的是无序列表 我知道我可以搜索列表项以找到具有 活动 CSS 类的项 但我想知道是否可以直接询问轮播对象 另外 能够访问目标索引 在 幻灯片 事件上 也会很方便 同样 我可以通过搜索来做到这一点 v
  • EJB weblogic.ejb20.cache.CacheFullException

    我正在使用 EJB1 2 开发一个应用程序 以前运行良好 但从过去几天开始 我遇到了以下异常 Exception in ejbLoad weblogic ejb20 cache CacheFullException size 85783 t
  • 使用Python使用字典将罗马数字转换为整数

    我正在学习编码 并且我有一个练习来制作罗马数字到整数的转换器 我意识到编写这个程序有很多不同的方法 但如果您能帮助我找到我的错误 我将不胜感激 我很想听到关于如何写得更好的建议 但我现在真正可以使用的是理解我在这方面做错了什么 我有一本字典
  • 如何用汇编语言(ASM)检查“数组的长度”,

    我刚刚开始学习汇编语言 在java中 如果我们有一个数组 我们总是可以使用array length来获取它的长度 装配中有这样的事情吗 如果是这样 有人可以在这里指导我吗 Edit 我很抱歉 我知道程序集没有数组 我试图简化事情 我的意思是