汇编程序不打印读取的字符串

2023-12-14

我编写了以下代码,允许用户输入一个数字并将其打印回来

.model tiny
.stack 100
.data
    userMsg db 13,10, 'Please enter a number: $'
    dispMsg db 13,10, 'You have entered: $'
    num dw dup 5(?)
.code
mov ax,@data
mov ds,ax

lea dx,userMsg
mov ah,9
int 21h

mov ah,0ah
lea dx,num
int 21h

lea dx,dispMsg
mov ah,9
int 21h

lea dx,num
mov ah,9
int 21h

mov ah,4ch
int 21h

但是它不会打印用户的号码,而是显示以下错误:

INT 21h, AH=09h
address: 07131
byte 24h not found after 2000 bytes.
; correct example of INT 21h/9h:
mov dx, offset msg
mov ah,9

我究竟做错了什么?


num dw dup 5(?)

这是一种特殊的语法。这到底能组装吗?
通常的写法是num dw 5 dup (?),所以把重复次数before the dup操作员。

关于打印您在评论中所说的用户号码的问题:

谢谢,我已经添加了 $,现在正在打印

我严重怀疑打印的只是输入的数字,而不是其他任何东西,因为你错误地使用了 DOS 函数 09h 和 DOS 函数 0Ah!

DOS.BufferedInput 函数 0Ah 期望从您那里获得一个指针DS:DX它指向一个具有明确定义布局的结构。
第一个字节必须指定从第三个字节开始的存储空间有多大。
第二个字节是让 DOS 通知您输入了多少字节。
有关此 DOS 功能的更多信息,请阅读缓冲输入如何工作.

接下来是一个允许输入 5 个字符的示例。你会问,为什么我必须写6?那么,DOS 总是在输入的字符后附加一个回车字节 (13)。第一个字节的计数必须考虑到这一点。

num     db      6, 0, 6 dup (0)

由于实际字符开始于num + 2,这将是您需要传递给 DOS.PrintString 函数 09h 的地址。

byte 24h2000 字节后未找到。

然后还有一个小问题,即以 $ 结尾的字符。只需将回车字节 (13) 替换为 $ 字符即可。 $ 字符的 ASCII 代码是 24h (36)。

xor     bx, bx
mov     bl, [num+1]             ; The count obtained from DOS
mov     BYTE PTR [num+2+bx], '$'
mov     dx, OFFSET num+2
mov     ah, 09h
int     21h

before

num     6, 0, 0, 0, 0, 0, 0, 0,

input

2019

after

              '2' '0' '1' '9' CR
num     6, 4, 50, 48, 49, 57, 13, 0

printing

              '2' '0' '1' '9' '$'
num     6, 4, 50, 48, 49, 57, 36, 0
              ^
              DX
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编程序不打印读取的字符串 的相关文章

  • 两个 16 位数字相乘 - 为什么结果是 32 位长? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如果我将两个 16 位数字相乘 结果将是 32 位长 但为什么会这样呢 对此有何明确解释 为了我的正确理解 其计算方法是 n 位数字乘以
  • 是否可以调用驻留在 exe 中的非导出函数?

    我想调用驻留在第 3 方 exe 中的函数并获取其结果 好像有should是一种方法 只要我知道函数地址 调用约定等 但我不知道如何 有谁知道我会怎么做 我意识到任何解决方案都是非标准的黑客 但有must成为一种方式 我的非恶意用例 我正在
  • 二元炸弹 - 第 6 阶段

    这是拆解phase 6 08048dbf
  • Mac OS X 上的 64 位程序集运行时错误:“dyld:无可写段”和“Trace/BPT trap”

    当尝试运行以下汇编程序时 globl start start pushq 0x0 movq 0x1 rax subq 0x8 rsp int 0x80 我收到以下错误 dyld no writable segment Trace BPT t
  • 为什么 x86-64 上的 GCC 在函数内插入 NOP?

    给定以下 C 函数 void go char data char name 64 strcpy name data x86 64 上的 GCC 5 和 6 编译 普通gcc c g o其次是objdump 这到 00000000000000
  • 内存映射图形输出

    我正在探索使用内存映射图形绘制像素和线条 我在 Windows 的 Textpad 中使用 TASM 当我单击 运行 时 整个屏幕变成蓝色 就是这样 没有绘制像素 model small stack data saveMode db xVa
  • 查找用户输入中的第一个和最后一个大写字母

    输入将从 a z 或 A Z 中获取 并且输入以星号结束 我们需要将输入字符的第一个和最后一个大写字母作为输出 另外 我们应该显示每次输入的内容 注意 我们逐个字符地获取输入 而不是作为字符串 测试用例1 输入 aAbCcP 输出 AP 测
  • 如何从内存加载值而不污染缓存?

    我想读取内存位置而不污染缓存 我正在 X86 Linux 机器上工作 我尝试使用 MOVNTDQA 汇编指令 asm movntdqa source dest n t dest x my var source m my mem 0 memo
  • 汇编PC相对寻址模式

    我正在研究数据路径 并一直在尝试理解分支指令 这就是我的理解 在 MIPS 中 每条指令都是 32 位 这是 4 个字节 所以下一条指令将是四个字节之外 举个例子 我说PC地址是128 我的第一个问题是理解这个128意味着什么 我目前的信念
  • 无法理解寄存器和变量之间的汇编mov指令

    我在 64 位 Linux 上使用 NASM 汇编器 有一些关于变量和寄存器的东西我无法理解 我创建一个名为 msg 的变量 msg db hello world 现在 当我想写入标准输出时 我移动msg to rsi注册 但我不明白mov
  • 在 OllyDbg 和 Assembler 中,EBP+8 是什么意思?

    我正在学习 OllyDbg 中的汇编和调试技巧 以便学习如何使用未记录的函数 现在我遇到以下问题 我有以下代码部分 来自 OllyDbg MOV EDI EDI PUSH EBP MOV EBP ESP MOV EAX DWORD PTR
  • 解释一下 AF 标志在 x86 指令中如何工作?

    我有一个小型 8086 模拟器 并且我已经有一个长期存在的错误了大约 2 年 因为 AF 在 sub 和 add 指令内无法正常运行 我当前计算其值的方法是 8 位数字和减法 uint8 t base subt base base 0xF
  • 了解近调用指令编码

    通过反汇编一些二进制代码 我发现了近调用指令call 0x8ae编码为e8 97 08 00 00 查看指令集参考 我发现这些指令被编码为 call XX XX XX XX lt gt e8 XX XX XX XX being XX XX
  • GCC 优化对位操作的有效性

    以下是在 x86 64 上设置 C 中单个位的两种方法 inline void SetBitC long array int bit Pure C version array 1 lt
  • ASM 中从小端到大端的快速转换

    我在 C 中有一个 uint 类型数组 在检查程序是否在小端机器上运行后 我想将数据转换为大端类型 因为数据量可能会变得非常大 但总是均匀的 所以我想考虑将两个 uint 类型作为 ulong 类型 以获得更好的性能并在 ASM 中对其进行
  • 深入了解事物如何打印到屏幕上(cout、printf)以及我在教科书上似乎找不到的真正复杂内容的起源

    我一直想知道这个问题 但至今还没有找到答案 每当我们使用 cout 或 printf 时 它们到底是如何打印在屏幕上的 文本是如何显示出来的 这里可能是一个相当模糊的问题 无论你给我什么 我都会工作 那么基本上这些功能是如何制作的 是汇编吗
  • 从 GP regs 加载 xmm

    假设您的价值观是rax and rdx你想加载到xmm登记 一种方法是 movq xmm0 rax pinsrq xmm0 rdx 1 虽然速度相当慢 有没有更好的办法 在最近的 Intel 或 AMD 上 你不会在延迟或 uop 计数方面
  • NASM 解析错误,需要指令

    我问过类似的问题here https stackoverflow com questions 11572021 problems with winasm and zen of assembly但我改变了汇编器 问题几乎完全改变了 所以为了避
  • 32 位 x86 汇编中堆栈对齐的职责

    我试图清楚地了解谁 调用者或被调用者 负责堆栈对齐 64 位汇编的情况相当清楚 它是由caller 请参阅系统 V AMD64 ABI 第 3 2 2 节栈帧 输入参数区域的末尾应按 16 对齐 32 如果 m256 在堆栈 字节边界上传递
  • ESP 和 EBP 寄存器是什么?

    我发现ESP寄存器是当前堆栈指针 EBP是当前堆栈帧的基指针 但是 我不理解这些定义 我刚刚开始学习如何在汇编程序中编码 What I understand is that ESP points towards the stack itse

随机推荐

  • 有什么方法可以根据类模板类型初始化此变量吗?

    我有课stats带有模板 这样就可以灵活使用 不过 我对模板很陌生 我认为它们的重点是使其在用户周围灵活 所以我觉得我做错了什么 因为我撞到了一堵小墙 include
  • SQL,关于连接的问题

    我在 sql 2012 中有两个表 名称和产品 其结构 name id int increment name1 nvarchar 50 prod id int increment products nvarchar 50 id name i
  • 如何在 Indy 10 中启用完美前向保密?

    我在 Delphi 2010 中使用 OpenSSL 1 0 2o 和 Indy 10 6 2 这是我到目前为止所做的 procedure TServerForm FormCreate Sender TObject var LEcdh PE
  • 对 WCF 行为扩展进行单元测试

    这真让我抓狂 我有一个扩展 如果出现错误 我们可以用它来更改请求的内容响应 基本上 如果一切正常 它会正常序列化为 JSON 但如果我们收到未处理的异常 我们会根据不同的对象进行序列化 我们需要围绕此进行单元测试 但我不知道如何编写它们 验
  • UITableView 自定义单元格图像在滚动后消失。

    我正在创建我的开放网格视图 我创建了一个自定义单元格 如下所示 我像这样处理填充它 UITableViewCell tableView UITableView tableView cellForRowAtIndexPath NSIndexP
  • android LoginButton.setFragment 中的 facebook 登录

    我的 LogginButton 有问题 LoginButton authButton LoginButton v findViewById R id authButton authButton setFragment this 我使用的片段
  • 从 $request_body 记录 POST 数据

    我的配置设置可以处理一堆 GET 请求 这些请求呈现的像素可以很好地处理分析和解析查询字符串以进行日志记录 使用额外的第三方数据流 我需要处理对给定 URL 的 POST 请求 该 URL 在其请求正文中具有预期可记录格式的 JSON 我不
  • 如何在 JavaScript 中从多维数组中删除空数组?

    我在从 Google Sheets 中的搜索应用程序的多维数组中删除空数组 对象时遇到问题 我在用getLastRow所以我以为我会避免这个问题 但不幸的是事实并非如此 我的数组如下所示 1 39080000912E11 RSSMA0040
  • 通过 std::bind 传递右值

    我想传递一个右值std bind到 C 0x 中采用右值引用的函数 我不知道该怎么做 例如 include
  • Java、传值、引用变量

    我在理解以下示例中 Java 的 按值传递 操作时遇到问题 public class Numbers static int s ccc 7 static int t ccc 7 public static void calculate in
  • Intel 在哪里记录了 ModR/M 字节中扩展寄存器 (R8-R15) 的编码?

    我用的是官方最新的 英特尔 64 和 IA 32 架构软件开发人员手册合并卷 1 2A 2B 2C 2D 3A 3B 3C 3D 和 4 作为了解x86 64 ISA的机器级编码的参考 第 2 卷第 2 1 3 节中提供的 ModR M 和
  • 从修订历史记录中删除特定文件

    我试图从修订历史记录中删除我无意提交的特定文件 有人可以提供一种方法来做到这一点吗 你需要使用svndumpfilter工具 该过程涉及转储您的存储库 过滤 使用svndumpfilter 你的转储文件 并将结果重新加载到新的存储库中 看本
  • 在哪里可以阅读访客信息

    UPDATE 这个问题暴露了过时的 最糟糕的方法visitors count每个人都应该避免这种情况 使用复杂的计数器 由于我没有找到令人满意的 足够简单 的解决方案 因此我想出了自己的解决方案 创建一个名为的空文件ip txt并在代码中的
  • 用python中的列表替换元素

    在Python中 用另一个列表中的元素替换列表中的元素的最佳方法是什么 例如 我有 a 1 replace this 4 我想更换replace this with 2 3 更换后必须是 a 1 2 3 4 Update 当然 可以用切片来
  • 如何复制 Azure 容器和 Blob

    我正在尝试将所有 blob 复制到不同的存储中 CloudBlobClient srcblobClient sourceStorageAccount CreateCloudBlobClient CloudBlobClient targetB
  • MapFragment:使用后退按钮后性能不佳

    我在使用时遇到性能问题MapFragment与操作栏菜单一起 当满足三个条件时就会出现该错误 Have a MapFragment实例化 从选项菜单触发片段事务 用另一个片段替换地图片段 点击后退按钮并返回到地图片段 现在性能明显下降 平移
  • 使用 ShapedDrawable 将 ColorFilter 应用于 ImageView

    我有一个ImageView with android src设置为ShapedDrawable 即一个白色圆圈 我想要的是给这个上色ImageView在运行时响应一些事件 imgView setColorFilter似乎是解决方案 但使用此
  • 使用 IP 地址从 C# HttpClient 向同一台机器发出 HTTP 请求

    基本上 我需要能够在我所在的同一台计算机上向网站发出 HTTP 请求 而无需修改主机文件来创建指向域名的指针 例如 我在一个网站上运行代码 假设 www bobsoft com 位于服务器上 我需要向位于同一服务器上的 www tedsof
  • 如何在 Sqlite 中将图像存储为 blob 以及如何检索它?

    我想将图像 来自 url 存储到 sqlite 数据库中 为此 我使用 db new DataBase getApplicationContext URL url new URL http sree cc wp content upload
  • 汇编程序不打印读取的字符串

    我编写了以下代码 允许用户输入一个数字并将其打印回来 model tiny stack 100 data userMsg db 13 10 Please enter a number dispMsg db 13 10 You have en