【问题标题】:How does assembly language interact with something like the Internet?汇编语言如何与 Internet 之类的东西交互?
【发布时间】:2011-02-06 20:22:10
【问题描述】:

所以前几天我在考虑语言,令我震惊的是,任何用编译语言编写的与 Internet 交互的程序都会被翻译成必须与 Internet 交互的程序集。我刚刚开始学习一点 x86 汇编,以帮助我更好地理解 C++,但我对如此低级的东西如何能够完成诸如访问 Internet 之类的事情感到困惑。

我确信这个问题的完整答案远远超过 SO 答案,但有人可以给我一个基本的总结吗?

【问题讨论】:

  • 这是一个类似的问题。 stackoverflow.com/questions/1837582/… 除此之外,您必须记住,“访问互联网”只是通过线路将格式化为 TCP/IP 消息的数据发送到另一台计算机。当我意识到它并没有什么神奇之处时,这对我来说也是一种顿悟。
  • 整个互联网运行在 1 和 0 上,或者更确切地说,整个互联网是无数机器代码 sn-ps 交互的产物。我觉得这可以说更令人惊讶。 :)

标签: assembly


【解决方案1】:

在所有现代系统中,“与互联网交互”的用户空间程序通过向底层操作系统发出 system calls 来实现这一点,底层操作系统为 TCP/IP 堆栈提供 API。

有问题的系统调用(例如socketlistenaccept 等)通常在 C 级别记录,但在每个特定的操作系统实现中,它们当然会转换为机器代码.但是,值是在特定寄存器中,还是在特定寄存器指向的内存中的位置等中,是非常小的,并且完全是系统特定的。

如果您想知道内核和设备驱动程序中的机器代码(可能也从 C 编译而来)如何“与互联网交互”(响应系统调用),它通过在内存中构建和维护来实现数据结构来跟踪各种事物的状态,并通过与底层硬件交互(例如,通过中断、I/O 端口、内存映射设备区域或特定架构使用的任何东西)——就像它与(比如说)一个视频显示器或磁盘设备。

【讨论】:

  • 是的......很难想象这么小的用户模式程序会做这样复杂的事情,但实际上它只是调用一个用更高级别(C/ C++),然后由编译器翻译成一堆汇编代码,在某个非常低的级别,通过以太网电缆将一堆 5 伏高和 0 伏低电平发送到世界的另一端。 .(如果我理解正确的话)
  • 从技术上讲,物理以太网脉冲只能到达您的路由器。然后路由器负责代表您将它们重新传输到下一个路由器,下一个路由器负责重新传输它们,等等。
【解决方案2】:

这取决于。当您读到用 C 编写的 Web 脚本时,它实际上是一个 CGI 程序。 CGI 是一种协议,而不是一种语言。 CGI 指定将“GET”、“POST”等放入 REQUEST_METHOD,将“foo=bar?baz=42”放入 QUERY_STRING,将数据放入 stdin 等。为了访问这些,CGI 程序使用系统调用。 Web 服务器使用 CGI 与 Web 脚本进行通信。自己通过 Internet 进行通信的程序可以使用系统套接字 API。

总之,操作系统负责所有的通信。该程序只是进行正确的系统调用。

如果您想知道操作系统如何通过 Internet 进行通信,答案是操作系统内核使用驱动程序通过 IO 端口、内存映射 IO 等方式与网卡进行交互。操作系统和网卡实现让所有东西协同工作的 Internet 协议标准。

【讨论】:

    【解决方案3】:

    您需要做的是查找其中一些 PIC 网络服务器项目。其中一些是用汇编编写并在 8 位硬件上运行的 Web 服务器。它将让您清楚地了解如何使用像汇编这样低级别的东西通过 Internet 与世界其他地方进行交互。

    基本上涉及

    1. 编写一些低级驱动程序(第 2 层)以与网络硬件接口 - 这可能使用以太网甚至调制解调器(带 SLIP)。
    2. 编写下一层 - IP 和 TCP - 以处理 TCP/IP 数据包。这需要一些组装魔法,因为这些过程非常复杂。
    3. 编写利用底层的应用层 - 无论是 Web 服务器还是客户端或其他任何东西。

    希望这能消除一些疑问。

    【讨论】:

      【解决方案4】:

      是否可以合理地说,无论程序如何,代码在某些时候都会被转换(因为缺少适当的术语)成某种形式的“汇编”语言(我认为不止一种),然后有一个“一对一”与机器码的关系?不确定 .NET 和 ILASM/Java 及其相应的字节码如何适应这一点,但我认为所有这些在某个时候都变成了汇编,然后变成了机器代码。

      【讨论】:

        猜你喜欢
        • 2013-07-07
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        相关资源
        最近更新 更多