【问题标题】:How to receive parameters from MS-DOS and compares it in Assembly 16-bits?如何从 MS-DOS 接收参数并在 16 位汇编中进行比较?
【发布时间】:2017-05-18 03:58:40
【问题描述】:

晚安,在 Assembly 16-BITS 中接收 simple char 作为参数的最简单方法是什么,并进行比较以测试是否正确?我花了 2 天时间寻找如何做到这一点的示例,但没有人为我工作... 我试过了 code from StackOverflow 但它不起作用,dx 有 81h 没有我需要的字符的十六进制。我是 Assembly 的新手,所以我需要一些代码示例来理解...我想要尽可能简单的方法,我不想浪费你的时间 ... 谢谢。 在 MS-DOS shell 中,我将调用我的程序,前面带有一个字符,例如 "MOVE A"。上面引用的代码中的示例类似于 Echo但我无法比较命令行中插入的字符。我使用的是 Windows 98 和 TASM 4.1 我尝试了 13.3.12 章 链接中引用的 Art of Assembly 书的示例,该书谈论的是 PSP,而且,不适用于我需要的东西。我认为人们不理解我想学的东西。 谢谢大家

【问题讨论】:

  • 我们了解您想要什么,您不了解我们。你确实需要它来自 PSP,偏移 81h。该示例代码加载了地址,因为您需要该地址。否则,您可以只使用 mov al, [81h]cmp [81h], 'a' 或类似名称。 PS:尽量少用粗体,谢谢。
  • 这正是我要说的!我尝试了很多方法,但都不起作用。似乎 char 不去注册....
  • 是的,当然。而且我不知道如何调试和编程需要参数才能工作。我几乎要放弃它了...
  • 也不起作用photo 在这个测试中,程序只有在发送 A 时才会打印。但它没有

标签: assembly command-line x86 dos tasm


【解决方案1】:

是的,命令行位于81h,正如您已经被告知的那样。然而,在这些示例中,地址必须传递给打印字符串函数。如果你想访问字符本身,你将需要一个内存加载,而不仅仅是它的地址。至少在我可用的 dosbox 版本中,不包括命令名称,但包含分隔空间。因此,如果您以move a 调用程序,实际参数字符将位于偏移量82h。因此,此示例代码将加载并打印该字母:

org 100h

mov dl, ds:[82h]
mov ah, 06h
int 21h
mov ax, 4c00h
int 21h

显然tasm 需要ds: 前缀,否则它会发出[Constant] assumed to mean immediate constant 警告并继续将其用作立即数而不是地址。

PS:学习使用调试器。

【讨论】:

  • 我使用了82h 并告诉了你原因。那么为什么你有81h?您还创建了一个 exe 文件,而您一直在要求一个 com 文件。这只能作为 com 文件使用。
  • 也不适用于 [82h] PRINTSCREEN @Jester
  • 现在你有 mov ah, 02h 而不是 mov ah, 06h ... 错误的功能代码。
  • 这是相同的屏幕截图,并且有 02 而不是 06
  • 现在你加载dl,但比较al。作品here
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
相关资源
最近更新 更多