eax 与其他寄存器相比的不同行为

2024-01-09

我编写了一个小的汇编代码片段(Gas,32 位),它接受命令行参数,计算其字符并打印字符串(如果它具有一定的长度)(仅用于调试目的)。我对汇编比较陌生,所以我很确定我在这里错过了一些东西,因为当我将字符串存储在 eax 中时,与 ecx、edx 或 esi 等相比,我会得到不同的行为。

这是片段。当您用 eax 替换 esi 时,无论字符串有多长,循环都只会进入两次,因此计数器 (ebx) 始终为 1。使用 esi 或其他寄存器,一切似乎都工作正常。

.section .text
.globl _start
_start:
    movl    %esp, %ebp
    movl    0(%ebp), %eax   # get argc
    cmpl    $2, %eax        # ensure argc == 2
    jne     _exit           
    movl    8(%ebp), %eax   # get argv[1]
    movl    $0, %ebx        # set counter to 0
_begin_loop:
    movb    (%eax), %al     # load a character into %al
    cmpb    $0, %al         # see if \0 is reached
    je      _end_loop       # exit loop if at end of string
    incl    %ebc            # increment counter
    incl    %eax            # advance string
    jmp     _begin_loop
_end_loop:
    cmpl    $6, %ebx        # print the string if it's six characters long
    jne     _exit
    movl    $4, %eax        # prepare for output
    movl    $1, %ebx
    movl    8(%ebp), %ecx)
    movl    $6, %edx
    int     0x80
_exit:
    movl    $1, %eax
    movl    $0, %ebx
    int     0x80

有人可以给我一个关于我做错/误解的提示吗?

Greets


The al寄存器实际上是最低8位eax登记。所以,指令movb (%eax), %al破坏最低8位eax,那就是你的指针。

作为一般建议,学习使用调试器单步调试代码并找出计算机执行与您期望不同的操作的地方。

编辑:发布的代码中有一些微不足道的语法错误(例如ebc代替ebx),但我假设有一些复制错误,因为你说否则它可以工作。

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

eax 与其他寄存器相比的不同行为 的相关文章

  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • 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
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

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

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 这种没有推送寄存器的交换有多安全?

    我对汇编非常陌生 下面的代码应该通过两个不同的函数交换两个整数 首先使用swap c然后使用swap asm 但我怀疑 我是否需要push 我的意思是保存 汇编代码之前寄存器的每个值和pop稍后 就在返回之前 main 换句话说 如果我返回
  • 如何使用 Bochs 运行汇编代码?

    我想使用 Bochs 作为 8086 模拟器 是否有捷径可寻 我想要的是类似 emu8086 的东西 http www emu8086 com http www emu8086 com 如果程序的初始部分适合 512 字节 并且您不介意将自
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v

随机推荐

  • C++ 中的“伪原子”操作

    所以我知道 C 中没有什么是原子的 但我试图弄清楚是否可以做出任何 伪原子 假设 原因是我想避免在一些简单的情况下使用互斥体 在这些情况下我只需要非常弱的保证 1 假设我有全局定义的 volatile bool b 其中 最初我设置为tru
  • UIAlertController 中的 UITextField(边框、背景颜色)

    这是一个屏幕截图UIAlertController 我只是在玩自定义字体textfield属性 但我无法完成以下任务 清晰的背景UITextField 没有难看的边框 黑框 如下所示 当我深入研究代码和 iOS 运行时标头时 我能够修改边框
  • PHP 哪个压缩函数具有与 mod_deflate 相同的输出?

    I tried gzencode contents 9 FORCE DEFLATE gzdeflate zlib encode contents 15 RFC 1951 raw deflate zlib encode contents 15
  • 使用 FLAG_ACTIVITY_REORDER_TO_FRONT 将数据发送到活动

    我有一些活动 A B C D 在每个活动上 它都有启动其他活动的按钮 所以 A可以启动B C D B可以启动A C D 我不想创建这些活动的多个实例 因此在启动活动时使用标志 FLAG ACTIVITY REORDER TO FRONT 每
  • JQuery的Ajax函数在chrome中工作但在firefox中返回404

    我正在使用中央 ajax 函数将 ajax Post 请求发送到服务器 这是该函数的代码 function postJson url jsObj whenSuccess whenError ajax type post headers Ac
  • 以十进制形式返回日期差异

    我试图以更高精度以小数形式返回两个日期之间的年数 例如 如果相差 1 年 1 个月 15 天 我想 返回值 1 15 或类似的值 最终 在这个 例如 我想显示差异是 1 年 1 个月又 15 天 差值以小数形式显示 我能够返回小数值 但我不
  • 这种方法是否有更快的替代方法来从字典列表中获取最后更新消息?

    我需要从数据流中获取最后的更新消息 数据是这样的 test data u category u 3 u entity u entityA u length u 0 u timestamp u 1562422690 u category u
  • iPhone/iPad HTML5 Canvas fillText问题

    使用 iPhone 或 iPad 时 我在画布上的文本方面遇到了奇怪的问题 文本要么被正确绘制 很少 要么被颠倒绘制 要么根本不被绘制 当文本确实成功绘制时 它会在 iPhone Pad 旋转时被擦除 我有以下代码 看来 如果我使用 set
  • 如何删除 VC 2008 中的“错误 C4335:检测到 Mac 文件格式”

    我现在用VC 2008编译一个项目 得到的错误如下 Error 7 error C4335 Mac file format detected please convert the source file to either DOS or U
  • 如何在 Spring MVC 测试中检查 JSON 响应

    我在 web xml 中定义了一个 servlet 因此我将其定义在 Controller 中 仅用于测试MyResource Controller public class TestMyServlet MyResource servlet
  • 开始为 JVM 分配内存

    我开始使用 Xmx上的选项java命令允许我的进程使用更多的内存 256Mb 尽管我认为我当前使用的内存少于 128Mb 我还注意到 Xms启动内存选项 默认值为 2Mb 我应该将此值设置为多少以及为什么 参考 Java http java
  • BASE64 编码和解码不起作用

    我正在 Delphi XE5 中开发 android 应用程序 我需要 BASE64 编码和解码一些字符串 这个函数对于英文字符工作正常 但是我想要编码 或任何特殊的 iso8859 2 字符编码不起作用 知道如何修复它吗 我找到了 BAS
  • 安装了测试适配器的 NUnit 单元测试未显示在测试资源管理器中

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我已经为 VS2012 2013 安装了 NUnit 测试适配器 当我第一次安装适配器测试时 它们会显示出来 但今天由于某种原
  • 如何在 NHibernate 中克隆对象?

    NHibernate中如何实现对象 实体 克隆 每个实体类都有这样的属性 public virtual IList
  • Java (Android) 中的调试模式(正则表达式)失败

    我正在一段代码中进行模式匹配 该代码在一种情况下运行良好 但在另一种情况下则不然 目前的代码是 DLVRYrx Pattern compile d s p Letter s d s d d s d Log d TAG Regex match
  • django 模型保存 - 迁移期间未调用覆盖方法

    我的模型类中有一个保存覆盖方法 每次保存对象时都会生成一个新的 slug def save self args kwargs if self column2 self slug slugify self column1 self colum
  • before_filter 语法,当你想要“排除”控制器“abc”时

    在 Rails 中 当您想要 排除 控制器 abc 时 before filter 语法是什么 例如 在 application controller 中 如果我想说 before filter login required except
  • 如何通过代码查找黑莓中的应用程序大小?

    我想知道如何通过代码查找黑莓中的应用程序大小 我想在单击按钮时显示正在运行的应用程序名称及其大小 那么我应该怎么做 我给出了一些解释 请参阅此链接 https stackoverflow com a 9074486 914111 https
  • 手写文字识别php

    我正在考虑创建一个特定的网络系统 它涉及许多不同的 随机 人上传他们所写内容的扫描文档 有没有PHP开源方法可以将这些手写文本转换为机器文本 我找到了这个question https stackoverflow com questions
  • eax 与其他寄存器相比的不同行为

    我编写了一个小的汇编代码片段 Gas 32 位 它接受命令行参数 计算其字符并打印字符串 如果它具有一定的长度 仅用于调试目的 我对汇编比较陌生 所以我很确定我在这里错过了一些东西 因为当我将字符串存储在 eax 中时 与 ecx edx