程序集 x86 NASM - 避免读取返回键

2023-12-04

我刚刚开始学习汇编,但没有找到任何有帮助的有用内容。

我正在创建一个简单的程序来读取用户输入,基本上:

section .bss
    opA: resw 1
    opB: resw 1

section .text
    global _start

    inputA:
    mov EAX, 3
    mov EBX, 0
    mov ECX, opA
    mov EDX, 1
    int 80h

    inputB:
    mov EAX, 3
    mov EBX, 0
    mov ECX, opB
    mov EDX, 1
    int 80h

    /*terminate*/

问题是,在我输入第一个值并按回车键后,第二个 sys_read 被跳过(我相信它正在读取“\n”字符)。

所以我尝试比较 opB 是否存储了“\n”,在肯定的情况下我跳回“inputB:”,如下所示:

cpm word[opA], '\n'
je inputB

但它不起作用!我该如何解决这个问题?

更简单,如何从变量中删除换行符?


一种选择是刷新标准输入缓冲区:

section .data
    opA: db 0
    opB: db 0
    LF: db 10

section .text
global _start
_start:

    inputA:
    mov EAX, 3
    mov EBX, 0
    mov ECX, opA
    mov EDX, 1
    int 80h

    mov eax,54          ; kernel function SYS_IOCTL
    mov ebx,0           ; EBX=0: STDIN
    mov ecx,0x540B      ; ECX=0x540B: TCFLSH
    xor edx, edx        ; EDX=0: TCIFLUSH
    int 0x80            ; sys_call

    inputB:
    mov EAX, 3
    mov EBX, 0
    mov ECX, opB
    mov EDX, 1
    int 80h

    mov eax,54          ; kernel function SYS_IOCTL
    mov ebx,0           ; EBX=0: STDIN
    mov ecx,0x540B      ; ECX=0x540B: TCFLSH
    xor edx, edx        ; EDX=0: TCIFLUSH
    int 0x80            ; sys_call

    print:
    mov edx,3
    mov ecx,opA
    mov ebx,1
    mov eax,4
    int 0x80

    exit:
    mov eax, 1
    mov ebx, 0
    int 0x80

另一个选项(适用于管道)是读取 stdin 直到 EOF 或 LF:

section .data
    opA: db 0
    opB: db 0
    LF: db 10
    dummy: db 0

section .text
global _start

reads:
    .1:                 ; Loop
    mov eax,3           ; kernel function SYS_READ
    mov ebx, 0          ; EBX=0: STDIN
    mov ecx, dummy      ; dummy buffer
    mov edx, 1          ; number of bytes to read
    int 0x80            ; sys_call
    test eax, eax       ; EOF?
    jz .2               ; yes: ok
    mov al,[dummy]      ; no: fetched character
    cmp al, 10          ; character == LF ?
    jne .1              ; no -> loop (i.e. fetch next character)
    .2
    ret

_start:

    inputA:
    mov EAX, 3
    mov EBX, 0
    mov ECX, opA
    mov EDX, 1
    int 80h

    call reads

    inputB:
    mov EAX, 3
    mov EBX, 0
    mov ECX, opB
    mov EDX, 1
    int 80h

    call reads

    print:
    mov edx,3
    mov ecx,opA
    mov ebx,1
    mov eax,4
    int 0x80

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

程序集 x86 NASM - 避免读取返回键 的相关文章

  • 嵌入式系统:使用汇编语言时的内存布局

    根据我的理解 嵌入式系统运行机器代码 有多种方法可以生成此代码 一种是用 C 等高级语言编写程序 然后使用编译器获得这样的代码 另一种方法是用汇编语言为该嵌入式系统编写指令 并使用汇编器将其转换为机器代码 现在我们得到了加载到系统并执行的机
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 错误:无法识别的指令 [ORG]

    我试图编写一个引导加载程序以在 dos box 中使用 我写了下面的代码 BITS 16 tell the assembler that its a 16 bit code ORG 0x7C00 Origin tell the assemb
  • 将以下机器语言代码(0x2237FFF1)翻译成MIPS汇编

    到目前为止我已经翻译了这段代码 但我不明白的是如何计算 计算 16 位立即地址的数量 0x2237FFF1 转为二进制 0010 0010 0011 0111 1111 1111 1111 0001 现在我正在读取操作码 001000 并知
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 将代码保存在 L1 缓存中

    我一直在阅读维基百科关于 K 编程语言的文章 http en wikipedia org wiki K programming language Performance characteristics这就是我所看到的 解释器的小尺寸和语言的
  • 跳转目的地太远:3 个字节

    我的循环有问题 其中包含的代码很长并且给了我错误jump destination too far by 3 byte s 当我删除时 mov edx offset str1 call writestring 这部分位于主过程下方 它不会给出
  • 当内存排序放宽时,C++ 延迟会增加

    我在 Windows 7 64 位 VS2013 x64 发行版 上尝试内存排序 我想使用最快的同步来共享对容器的访问 我选择了原子比较和交换 我的程序产生两个线程 写入器推送到向量 读取器检测到这一点 最初我没有指定任何内存顺序 所以我假
  • 寻找有效的移位/加法/LEA 指令序列来乘以给定常量(避免 MUL/IMUL)

    我正在尝试编写一个 C 程序 mult c 它有一个接收 1 个 int 参数的 main 函数 用atoi argv 1 这是一些常数k我们想要乘以 该程序将生成一个汇编文件mult s实现 int mult int x return x
  • 气体:内存引用太多

    编译时指令如下 movl 4 ebp 8 ebp I got 内存引用过多 它出什么问题了 括号之前的数字是字节偏移量 这会导致发生内存引用 并且不能有两个movl 您需要先将值暂时移至寄存器 movl 4 ebp ecx movl ecx
  • 英特尔 JCC 勘误表 - 用于缓解的前缀有什么影响?

    Intel 推荐 https www intel com content dam support us en documents processors mitigations jump conditional code erratum pd
  • X86 从 stdin 读取并写入 stdout,无需引用标准库

    我是 X86 汇编语言的初学者 我知道如何使用内置函数从标准输入读取数据并写入标准输出 但我不确定如何使用简单的汇编代码 即操作寄存器和利用系统调用 来做到这一点 include
  • /usr/bin/as:无法识别的选项“-EL”

    因此 在为我的1plus手机编译android内核时 经过3天的多次尝试 我放弃了并尝试在这里询问是否有人以前遇到过这个问题 这个错误对我来说有点模糊 但我觉得问题来自于我最近对 GNU Linux 发行版 Gentoo 的更改 它在不应该
  • x86 程序执行期间方向标志 (DF) 的默认状态

    在反汇编中 我经常看到使用字符串操作指令而不考虑方向标志 DF 的状态 如下所示 or ecx 0FFFFFFFFh xor eax eax mov edi ebp repne scasb CLD or STD自函数开始以来未找到指令 也未
  • 如何使用 LOCK ASM 前缀来读取值?

    我知道如何使用 LOCK 来线程安全地递增一个值 lock inc J 但是如何以线程安全的方式读取 J 或任何值 LOCK 前缀不能与 mov 一起使用 如果我执行以下操作 xor eax eax lock add eax J mov J
  • 编写一个新的 jit

    我有兴趣用 C 启动我自己的 JIT 项目 我对汇编或编译器设计等并不熟悉 但是 我对生成的机器代码格式非常不熟悉 比如 当一切都说了和完成后 mov 指令实际上是什么样子 是时候调用它了函数指针 那么 创建这样的东西的最佳资源是什么 编辑
  • 为什么 NASM 在使用有效的指令助记符作为操作数中的符号名称方面没有问题?

    我编写了以下简单程序 但 nasm 拒绝编译它 section text global start start mov rax 0x01 mov rdi 0x01 mov rsi str mov rdx 0x03 syscall mov r
  • 如何通过查看程序集来判断程序是否使用动态调度

    我在 Reddit 上读过一篇文章Herb Stutter JIT 永远不会像原生一样快 http www reddit com r programming comments rr2dj herb stutter jit will neve

随机推荐

  • 在 OpenCL 中获得最佳本地/全局工作组大小?

    我正在使用以下函数来获取 OpenCL 应用程序的最佳本地和工作组大小 maxWGSize CL KERNEL WORK GROUP SIZE wgMultiple CL KERNEL PREFERRED WORK GROUP SIZE M
  • wpf工具包图表旋转轴

    如何将轴上的文本从水平旋转为垂直 我无法通过 xaml 来完成此操作 因为我正在动态创建多个系列 并且在控件填充之前我不知道我将拥有多少个系列 我需要垂直或倾斜显示日期 而不是水平显示 再次感谢你 这篇文章解释了如何以适用于 WPF 和 S
  • Xcode 5 中的按键绑定

    我曾经这样做过 Xcode 重复行 但 IDETextKeyBindingSet plist 不再存在 有一个名为 KeyBindings 的文件夹 其中有一个空白文本文件 那么我们现在如何设置按键绑定呢 具体来说 我只想使用 comman
  • 提高网络编码性能

    我目前正在开发一个基于 Java 的网络编码库 http en wikipedia org wiki Network coding 这非常消耗 CPU 资源 因此需要一些帮助来优化编码阶段 我本质上所做的是创建原始数据的随机线性组合 其中加
  • assetLibrary 是一个简单的错误吗?

    我真的很失落 为什么我每个都得到两次 NSLogUIImage get the images from the camera roll assets NSMutableArray alloc init NSMutableArray came
  • 使用Python列出Windows 10上本地运行的服务?

    我所需要做的就是创建一个程序 列出 Windows 计算机上所有正在运行的服务 我尝试了很多方法 包括psutil 但都没有效果 此后我尝试通过尝试执行 net stat 命令来简化它 它可以工作 但输出是乱码 有没有办法把它保存到一个漂亮
  • vb.net 中的 lambda 表达式

    我有一些东西让我绝对疯狂 Public Function GetAccountGroups As IList Of AccountGroup Dim raw account groups As IList Of AccountGroup r
  • Android:在 NDK 中的 jar 文件中链接预构建的共享库 (.so)

    我有一个编译为 jar 文件的静态 java 库 该 jar 使用 System loadLibrary 加载 so 库 然后另一个 Android 应用程序项目静态链接该 jar 文件 所有内容都是使用 NDK 中的 Android mk
  • 命令“/bin/sh -c apt-get install erlang”返回非零代码:1

    我是 Docker 的初学者 使用 Ubuntu 18 04 作为主机 在寻找解决方案时 我得到的唯一结果就是增加虚拟机磁盘大小 因为它是由于内存不足而发生的 我没有使用虚拟机 可用磁盘大小为 87 GB 以下是我的 docker 文件内容
  • 将 Google Cloud App Engine 上的 Node.js 应用连接到 Google Cloud SQL 实例

    我有一个使用 MySQL 的 Node 应用程序 通过配置 json 连接 client mysql connection host something user something password something database
  • puppeteer page.evaluate 页面未定义

    我想用 puppeteer 在输入中输入内容 但它返回一个错误 页面未定义 async function login const browser await puppeteer launch headless false const pag
  • 如何从类型转换为泛型?

    嘿那里 给出的是这个类 public static class FooClass
  • 如何制作 Android EditView“完成”按钮并在单击时隐藏键盘?

    当用户点击EditView Android 打开键盘以便用户可以在EditView 问题是 当用户写完后 没有办法隐藏键盘 用户必须按后退按钮才能隐藏键盘 有没有办法显示Done键盘上的按钮会隐藏键盘吗 首先你需要设置android ime
  • 在 IE 上使用 jquery 访问 Iframe 内容

    我正在尝试使用隐藏的 Iframe 上传文件并获取响应 以下代码在 Firefox 上运行良好 但在 IE 上无法运行 它无法获取响应 Line var content j this contents find body last text
  • Android - 微调器的文本下拉列表/选择不显示

    我正在使用此示例代码来填充 Spinner 数据是从数据库中读取的 选择显示正确 在本例中 它显示 绿色 和 红色 Spinner spinnerColor Spinner findViewById R id spinnertProfile
  • 如何使用 SOCK_DGRAM 制作双向 unix 域套接字?

    我正在尝试编写一个简单的 Unix 数据报服务器 客户端 但遇到了一些问题 我想要的是一个监听数据报套接字并向原始发送者发送对收到的每条消息的回复的服务器 我决定先尝试使用socat成为 服务器 并用 C 编写客户端 我像这样运行 soca
  • Swagger UI 为空并给出 403

    我正在使用 Spring Boot 并且已将 swagger 添加到我的依赖项中
  • 如何将旧日志文件导入graylog作为输入?

    我能够设置灰色日志服务器和graylog web 并能够在 apache2 tomcat 和其他应用程序的帮助下设置生成日志的输入灰色日志收集器 e g apache access type file path var log apache
  • Mac OSX 在构建 MonoDevelop iOS 应用程序时要求钥匙串访问

    在 Mac 上的 MonoDevelop 中构建项目时 我收到消息 MAC OS X 想要进行更改 请键入管理员的名称和密码以允许此操作 MAC OSX 想要使用系统钥匙串 我找到了帖子Mac OS X 想要在编译项目时使用系统钥匙串但这并
  • 程序集 x86 NASM - 避免读取返回键

    我刚刚开始学习汇编 但没有找到任何有帮助的有用内容 我正在创建一个简单的程序来读取用户输入 基本上 section bss opA resw 1 opB resw 1 section text global start inputA mov