【问题标题】:Where are the system codes coming from in x86-64 Assembly?x86-64 汇编中的系统代码来自哪里?
【发布时间】:2014-12-21 19:29:45
【问题描述】:

我正在浏览一些组装演示(在 Mac 上使用 NASM,我是组装新手)并看到如下内容:

; read a byte from stdin
mov eax, 3     ; 3 is recognized by the system as meaning "read"
mov ebx, 0     ; read from standard input
mov ecx, variable    ; address to pass to
mov edx, 1     ; input length (one byte)
int 0x80             ; call the kernel

我开始明白eaxebx等是“通用寄存器”,就是你存放常用东西的地方。那里还有更多要学的东西,但我明白了它的要点。

但我对3系统识别为“读取”)和0从标准输入读取等值的位置感到困惑) 来自。你怎么知道0 的意思是“标准输入”?是否有此类整数值的列表,或一些书籍或标准参考资料?

【问题讨论】:

  • 秘密在下一条指令中:int 0x80。这是对系统例程的调用,该例程检查其他寄存器中的值以查看它应该做什么。
  • 这其实和汇编无关,它就像操作系统定义的契约——当你调用中断0x80时,这些值表示你想让它做什么。

标签: assembly nasm


【解决方案1】:

您将系统调用号与系统调用参数混为一谈。

系统调用号(例如“3 = read”)是特定于操作系统的(嗯,是特定于内核的),有时是特定于版本的。例如,查看 x86 here 和 x86_64 here 上的 Linux 系统调用号。参数的传递方式、系统调用的调用方式以及系统调用号的含义都是特定于体系结构和内核的。

另一方面,“标准输入”的数字“0”是一个 UNIX 标准化值,STDIN_FILENO

【讨论】:

  • Bam,这正是我想要的!谢谢 :) filippo.io/linux-syscall-table
  • 那么这是否意味着,例如,这个纯程序集BareMetal OS 不会有这些系统调用号,因为它的级别比这低?而 Linux 或 OSX 将拥有自己的一组系统调用号,因为它们构建了比 BareMetal OS(或任何其他外内核)更高的抽象层?
  • @LancePollard 是的。如何调用系统的方式是系统特定的。使用int 0x80 发出系统调用的约定是特定于Linux 的。例如:在 Windows NT 下,系统调用由客户端通过ntdll.dll 中的函数发出。在较低级别上,它们使用int 0x2Esysenter 指令实现。有关概述,请参阅Wikipedia: Application Binary InterfaceWikipedia: System callWikipedia: Native API
  • 谢谢,这些资源让我明白了很多。
猜你喜欢
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多