汇编代码不识别?和@数据

2024-02-26

这是我的第一个汇编程序。
任何人都可以帮助使其成功运行。
我看到下面的编译错误。

为什么它不识别? and @data?
我正在尝试交换汇编中的两个变量。

我正在执行以下命令

nasm -f elf swap.asm

但我收到这个错误:

swap.asm:6: error: symbol `?' undefined
swap.asm:12: error: symbol `@data' undefined
swap.asm:15: error: invalid combination of opcode and operands
swap.asm:21: error: invalid combination of opcode and operands
swap.asm:22: error: invalid combination of opcode and operands

这是我的代码:

section .data
    C equ 15
    var1 db 12

section .bss
    var2 db ?

section .code
    global _start
    _start:

    mov ax, @data
    mov ds, ax

    mov var2, C

    ; swap var1 and var2

    mov al, var1
    mov bl, var2
    mov var2, al
    mov var1, bl

    ; now print the swapped values
    mov eax, 4  ;   4 = sys_write
    mov ebx, 1  ;   1 - std out FD
    mov ecx, var1
    mov edx, 8
    int 80h

    mov eax, 4  ;   4 = sys_write
    mov ebx, 1  ;   1 - std out FD
    mov ecx, var2
    mov edx, 8
    int 80h

    ; exit the program
    mov eax, 1  ; 1 = sys_exit
    mov ebx, 0
    int 80h

此代码表明您可能已从 16 位代码的 MASM 教程中复制并粘贴了它:

mov ax, @data
mov ds, ax

在 Linux 上,模型是扁平的,因此这段代码是不必要的,可以删除。由于您正在使用 NASM 进行编译,因此您必须放置[]当您希望访问内存地址处的数据时,围绕内存引用(与 MASM 不同)。所以代码如下:

mov al, var1

应该:

mov al, [var1]

The NASM 文档 https://nasm.us/doc/nasmdoc2.html部分中有关于 NASM 和 MASM 语法之间差异的有用信息2.2 MASM 用户快速入门。我已在此修订后的代码中记录了许多其他所需的更改:

section .data
    C equ 15
    var1: db 12                ; NASM needs a colon after labels unlike MASM

section .bss
    var2: resb 1               ; NASM doesn't have '?'. Use RESB to allocate space
                               ; in BSS section. RESB 1 allocates 1 byte of space

section .text                  ; The code section in ELF is `.text` and not `.code`
    global _start
    _start:

    mov byte [var2], C         ; C doesn't need brackets because it was defined with EQU
                               ;     and is a constant (immediate) value.
                               ;     NASM can't determine the size of a constant
                               ;     nor does it know the size of data at var2
                               ;     so the BYTE directive is used on the memory operand.

    ; swap var1 and var2

    mov al, [var1]             ; Getting data from var1 - brackets needed
    mov bl, [var2]             ; Getting data from var2 - brackets needed
    mov [var2], al             ; Changing value at var2 - brackets needed
    mov [var1], bl             ; Changing value at var1 - brackets needed

    ; now print the swapped values
    mov eax, 4  ;   4 = sys_write
    mov ebx, 1  ;   1 - std out FD
    mov ecx, var1              ; No brackets because we want the address of var1
    mov edx, 1                 ; Print 1 byte
    int 80h

    mov eax, 4  ;   4 = sys_write
    mov ebx, 1  ;   1 - std out FD
    mov ecx, var2              ; No brackets because we want the address of var1

    mov edx, 1                 ; Print 1 byte
    int 80h

    ; exit the program
    mov eax, 1  ; 1 = sys_exit
    mov ebx, 0
    int 80h

如果您运行此代码,它可能不会打印您期望的内容。这SYS_write系统调用不打印整数 - 它打印字符串。如果要写入值 12 或 15,则需要将数字转换为字符串,然后将字符串的地址传递给SYS_Write系统调用。对于将整数转换为字符串的 32 位解决方案,您可以查看此问题的答案相关问题 https://stackoverflow.com/questions/19309749/nasm-assembly-convert-input-to-integer/49548057#49548057。 Peter Cordes 的另一个相关答案还有其他有用的信息 https://stackoverflow.com/a/46301894/3857942.

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

汇编代码不识别?和@数据 的相关文章

  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 在 Docker 容器中以主机用户身份运行

    在我的团队中 我们在进行开发时使用 Docker 容器在本地运行我们的网站应用程序 假设我正在开发 Flask 应用程序app py具有依赖关系requirements txt 工作流程大致如下 I am robin and I am in
  • 运行此处编译的 C 程序会导致在另一台服务器上找不到 GLIBC 库错误 - 是我的错还是他们的错?

    此处编译的 C 程序在我们的 Ubuntu 服务器上运行良好 但是当其他人尝试在他们的特定 Linux 服务器上运行它时 他们会收到以下错误 myprog install lib tls libc so 6 version GLIBC 2
  • 在 debian wheezy amd64 上安装 ia32-libs

    我正在使用 Debian 7 喘息 amd64 uname a Linux tzwm debian 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 我想安装ia32 libs在我的
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • 嵌入式系统:使用汇编语言时的内存布局

    根据我的理解 嵌入式系统运行机器代码 有多种方法可以生成此代码 一种是用 C 等高级语言编写程序 然后使用编译器获得这样的代码 另一种方法是用汇编语言为该嵌入式系统编写指令 并使用汇编器将其转换为机器代码 现在我们得到了加载到系统并执行的机
  • 如何在 Linux/OS X 上温和地终止 Firefox 进程

    我正在使用 Firefox 进行一些自动化操作 尽管我可以从 shell 打开 Firefox 窗口 但我无法正确终止它 如果我kill火狐进程与kill 3 or kill 2当我下次打开新的 Firefox 窗口时 命令会询问我是否要在
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

    在一台 GNU Linux 机器上 如果想要执行 实时 亚毫秒级时间关键 任务 您几乎总是必须经历漫长 复杂且容易出现问题的内核补丁过程 以提供足够的支持 1 http en wikipedia org wiki RTLinux Backg
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 如何将 elf 解释器(ld-linux.so.2/ld-2.17.so)构建为静态库?

    如果我的问题不准确 我深表歉意 因为我没有太多 Linux 相关经验 我目前正在构建一个 Linux 从头开始 主要遵循 linuxfromscratch org 版本的指南 7 3 我遇到了以下问题 当我构建可执行文件时 获取一个称为 E
  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • 将以下机器语言代码(0x2237FFF1)翻译成MIPS汇编

    到目前为止我已经翻译了这段代码 但我不明白的是如何计算 计算 16 位立即地址的数量 0x2237FFF1 转为二进制 0010 0010 0011 0111 1111 1111 1111 0001 现在我正在读取操作码 001000 并知
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na

随机推荐

  • 根据原始数据创建队列退出率表

    我需要帮助根据原始数据创建队列退出表 我有一个如下所示的数据集 DT lt data table id c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  • Chrome扩展-通过后台脚本获取Active Tab的DOM信息

    我知道有很多与这个主题相关的问题 但到目前为止 没有一个问题能让我在 V3 中解决这个问题 当我运行以下background js时 我只得到未定义的结果 我的扩展的目标 至少在这个阶段 是抓取活动选项卡的 DOM 并提取所有 div 元素
  • 如何通过https访问kubernetes服务?

    这是我的集群信息 kubectl cluster info Kubernetes master is running at https 129 146 10 66 6443 Heapster is running at https 129
  • 本地运行 web-Socket 进行调试

    我正在使用 gorilla web socket 我想在本地运行它 我的意思是使用以下 chrome 客户端 或其他推荐的工具 当我进入调试模式时出现错误 I use github com gorilla websocket var upg
  • 如何使用mysql将查询结果存储在变量中

    SET v1 SELECT COUNT FROM user rating SELECT v1 当我执行此查询时set变量显示此错误 Error Code 1064 You have an error in your SQL syntax c
  • 如何简单地扩展 docker-compose 服务并将索引和计数传递给每个服务?

    我正在寻找一种扩展 docker compose 服务的方法并看到了 scale 选项 但找不到任何方法来获取每个容器内的索引和计数 这是一个简化的撰写文件 version 2 1 services my thing restart alw
  • Java OpenCV 绑定

    我正在寻找 OpenCV java 绑定 所有引用都指向处理库 我知道处理是java 但是没有独立的java库吗 或者应该只使用处理库 我刚刚找到了这个 OpenCV 的 java 包装器 https github com bytedeco
  • Visual C++:将传统 C 和 C++ 字符串代码迁移到 Unicode 世界

    我看到 Visual Studio 2008 及更高版本现在开始使用字符集设置为 Unicode 的新解决方案 我的旧 C 代码仅处理英文 ASCII 文本 并且充满了 文字字符串如 Hello World char type char 指
  • 防止画布对象发生碰撞或交叉

    我正在画布上绘制 n 个矩形 矩形是可拖动和可缩放的 我想防止它们重叠或相交 最好的情况是 如果它们只是相互咬合 我想办法检查一下十字路口 在我的示例中 我将触摸对象的不透明度设置为 0 1 巧合的是 在我尝试解决这个问题时 我的对象在接触
  • 为什么在 cmd 中安装任何 python 模块时会收到这些错误“警告:忽略无效的分发 -yproj ”

    警告 忽略无效的分发 yproj c users space junk appdata local programs python python310 lib site packages 警告 忽略无效的分发 yproj c users s
  • 无法在 chrome google.maps api 中加载资源

    我在 chrome 控制台中出现此错误 Failed to load resource net ERR BLOCKED BY CLIENT https maps google com maps api v3 api js 22 2 intl
  • 修复 Flash 的激进缓存

    我有一个闪存应用程序 可以加载大量变化的数据偶尔 所以我设置了我的服务器来发送Last Modified标头并回复304 Not Modified当客户端的版本没有过时时 它在每个浏览器中都能正常工作 但 Flash 完全忽略这一点并积极缓
  • 在矩形的联合中找到孔?

    我在单位正方形 红色 内和周围有许多随机矩形 黑色 需要提取单位正方形内未被任何矩形覆盖的所有多边形区域 看起来这可以用 Shapely 来完成 当我得到矩形 绿色 的并集时 我已经达到了这一点 但我不知道如何从单位正方形中减去它并检索多边
  • Symfony2 路由不支持的键

    我正在学习 Symfony 2 但遇到一些问题 使用教程 我在routing yml内捆绑 acme demo homepage path hello name defaults controller AcmeDemoBundle Defa
  • 处理 Powershell 函数中的管道和参数输入

    我对 在一个月的午餐中学习 PowerShell 一书中看到的内容感到困惑 在第 21 章中 当作者讨论通过参数绑定或管道接受输入的函数时 他给出了两种模式 第一个如下 function someworkerfunction do some
  • PHP 5.4:获取实例变量的完全限定类名

    我知道有静电classPHP 5 5 上的字段 但我必须坚持使用 PHP 5 4 是否可以从变量中获取完全限定的类名 Example namespace My Awesome Namespace class Foo 以及代码中的其他地方 p
  • 尽管我已在 Xcode 5 中添加,但应用程序图标未显示

    我已经添加了如下图所示的图标 但我仍然没有在我的设备或模拟器中看到该图标 这可能是 XCode 5 的错误 即添加的图标实际上并未包含在应用程序包中 但您可以通过转到 构建阶段 展开 复制包资源 然后按底部的 号手动添加来解决此问题图标文件
  • 嵌套哈希已定义?() [重复]

    这个问题在这里已经有答案了 确定是否最简洁的方法是什么 hash key1 key2 已定义 如果 hash or hash key1 为零 defined hash key1 key2 返回 True 如果 hash key1 存在 不判
  • eclipse中从方法定义跳转到方法调用【Java视角】

    日食中 我们有一个快捷键可以从调用方法的任何地方跳转到方法定义 即使用 F3 但是 如果我当前位于方法定义上并且我想要转到调用或使用该方法的位置 该怎么办 这有什么捷径吗 你可以试试Ctrl Shift G这相当于查找参考文献 or Ctr
  • 汇编代码不识别?和@数据

    这是我的第一个汇编程序 任何人都可以帮助使其成功运行 我看到下面的编译错误 为什么它不识别 and data 我正在尝试交换汇编中的两个变量 我正在执行以下命令 nasm f elf swap asm 但我收到这个错误 swap asm 6