Assembly 汇编语言是如何与互联网这样的东西交互的?

Assembly 汇编语言是如何与互联网这样的东西交互的?,assembly,Assembly,前几天我想到了语言,我突然想到,任何用编译语言编写的与互联网交互的程序,都会被翻译成与互联网交互的汇编程序。我刚刚开始学习一点x86程序集,以帮助我更好地理解C++,我对这样低级别的东西如何能像访问Internet一样感到困惑。 我确信这个问题的完整答案远远超出了SO的答案,但有人能给我一个基本的总结吗?在所有现代系统中,“与internet交互”的用户空间程序都是通过向底层操作系统发出命令来实现的,该操作系统为TCP/IP堆栈提供API 有问题的系统调用(如socket、listen、acce

前几天我想到了语言,我突然想到,任何用编译语言编写的与互联网交互的程序,都会被翻译成与互联网交互的汇编程序。我刚刚开始学习一点x86程序集,以帮助我更好地理解C++,我对这样低级别的东西如何能像访问Internet一样感到困惑。 我确信这个问题的完整答案远远超出了SO的答案,但有人能给我一个基本的总结吗?

在所有现代系统中,“与internet交互”的用户空间程序都是通过向底层操作系统发出命令来实现的,该操作系统为TCP/IP堆栈提供API

有问题的系统调用(如
socket
listen
accept
,等等)通常在C级进行记录,但在每个特定的操作系统实现中,它们当然会转换为机器代码。但值是否进入特定寄存器,或特定寄存器指向的内存中的位置,等等,都是非常次要的,并且完全是系统特定的


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

这取决于具体情况。当你读到用C编写的web脚本时,它实际上是一个CGI程序。CGI是一种协议,而不是一种语言。CGI指定放置“GET”、“POST”,等等。将“foo=bar?baz=42”转换为查询字符串,将数据发布到stdin等。为了访问这些,CGI程序使用系统调用。web服务器使用CGI与web脚本进行通信。通过Internet进行通信的程序可以使用系统套接字API

总之,所有的通信都是由操作系统完成的,程序只是进行正确的系统调用


如果您想知道操作系统是如何通过Internet进行通信的,那么答案是操作系统内核使用驱动程序通过IO端口、内存映射IO等与网卡进行接口。操作系统和网卡实现了Internet协议标准,使所有功能都能协同工作。

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

它基本上包括

  • 编写一些低级驱动程序(第2层)与网络硬件接口-这可能使用以太网甚至调制解调器(带SLIP)
  • 编写下一层——IP和TCP——来处理TCP/IP数据包。这需要一些汇编技巧,因为这些过程非常复杂
  • 编写利用底层的应用程序层(无论是web服务器、客户机还是其他什么)

  • 希望这能澄清一些疑问。

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

    是的……很难想象这样一个小的用户模式程序会做这样复杂的事情,但实际上它只是在调用一个名为wri的库输入更高级别的代码(C/C++),然后由编译器将其翻译成一组汇编代码,在一些真正低级别的代码中,通过以太网电缆将一组5伏高和0伏低发送到世界的另一端…(如果我理解正确的话)从技术上讲,物理以太网脉冲只能到达你的路由器。然后路由器负责代表你将它们重新传输到下一个路由器,下一个路由器负责重新传输它们,等等。这里有一个类似的问题。除此之外,你必须记住“访问互联网”只是通过一根电线将格式化成TCP/IP消息的数据发送到另一台计算机。当我意识到它没有什么神奇之处时,这对我来说也是一种顿悟。整个互联网运行在1和0上,或者更确切地说,整个互联网是数量惊人的机器代码片段交互的产物。我发现这是可以论证的更令人惊讶的是……)