【问题标题】:Accepts and displays one character of 1 through 9 using assembly code in c使用 c 中的汇编代码接受并显示 1 到 9 的一个字符
【发布时间】:2018-04-15 07:51:46
【问题描述】:

有人可以解释一下这个汇编代码的每一行吗?

void main(void){
  _asm{
mov ah,8 ;read key no echo
int 21h
cmp al,‘0’ ;filter key code
jb big
cmp al,‘9’
ja big
mov dl,al ;echo 0 – 9
mov ah,2
int 21h
big:
}
}

PS:我是 c/c++ 汇编的新手。

【问题讨论】:

  • 这段代码的目标是什么操作系统/编译器?使用 16 位汇编让我觉得它非常非常古老。
  • 输入不在 ah 中,在 al 中(per docs)。
  • int 21h 正在针对旧的 DOS 界面进行编程,而 Visual C++ 通常针对 Windows 界面。相关:stackoverflow.com/q/9524388/39223
  • @RJHunter 感谢您指出错误...我对组装完全陌生...

标签: inline-assembly


【解决方案1】:

根据docs,返回值在al,而不是ah。这就是它与 al 相比的原因。


编辑:添加更多细节:

看这段代码:

mov ah,8 ;read key no echo
int 21h

把它想象成一个函数调用。现在,asm 中的函数调用通常看起来像 call myroutine。但是 DOS 使用中断来允许您调用各种操作系统功能(从键盘读取键,从文件读取数据等)。

所以,执行int 21h 指令称为操作系统。但是操作系统应该如何知道您想要哪个操作系统功能?通常通过在ah 中输入一个值。如果您搜索,您可以找到许多显示所有int 21h 函数列表的资源(如this)。右边的数字是您在ah 中输入的值。

所以,mov ah,8 正在准备调用“等待控制台输入而不回显”功能。 mov ah,2 是“显示输出”。其他寄存器用于将各种参数传递给被调用的函数。您需要阅读特定中断的描述以了解具体的中断。

请注意,这与“用 C 编写内联 asm”无关。这就是如何从 DOS 下运行的 C 代码调用 OS 函数。如果您不在 DOS 下运行,int 21 将无法工作。

【讨论】:

  • 您能解释一下代码及其工作原理吗?这对我很有帮助,因为我是 c 中的汇编新手
  • 如果你坚持我会的。但这是学习 asm 的一种非常糟糕的方式。当前的操作系统(Windows、Linux 等)不再使用int 21h。因此,除非您正在运行 DOS(或模拟器),否则它将无法正常工作。此外,在 C 程序中编写内联汇编通常是一个坏主意。如果要编写程序集,请编写程序集文件(扩展名为 .asm 或 .s),然后对其进行组合和链接。 Google 可能是一个更好的起点。
  • 我知道如何编写 8086 汇编代码。即.asm 文件,但我不熟悉 c 中的汇编语言。
  • 那我不知道你的问题是什么。 cmpjbmov都是8086的基本指令。 int 21h 也是如此,但它只在 DOS 和 DOS 模拟器下工作。您可以看到更多使用 msvc 的内联 asm here 的语法,但通常最好在 asm 文件中编写 asm,然后从 C 代码中调用它。另请注意,msvc 不支持在 64 位代码中使用内联 asm 根本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2014-05-13
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多