linux汇编和windows,为什么Windows,Linux等汇编语言之间存在差异?

本文探讨了汇编程序在不同平台上的工作原理,特别是那些针对小型微控制器和历史处理器如6502和Z80的程序。汇编器根据预期的内存地址生成二进制输出,而地址更改则需要重新组装。在某些系统中,源代码、汇编器和输出可以同时在内存中处理。然而,多步骤过程更常见,涉及源文件转化为包含汇编指令和符号信息的目标代码文件,随后进行链接和加载以适应不同地址。链接/加载阶段允许地址计算的延迟,不同系统支持的复杂性各异。文章还讨论了如何在有限的地址计算能力下编写高效代码的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存在一些用于各种平台的汇编程序,在给定源文件的情况下,将直接生成输出二进制文件被加载到特定地址 . 这种组装器已经广泛用于一些小型微控制器,或者用于6502和Z80等历史处理器 . 在组装程序时,有必要知道预期驻留的地址;使用不同的地址需要重新组装程序 . 另一方面,在这样的系统中组装是一步过程 . 在源代码上运行汇编程序并获取可执行输出 . 在某些情况下,可以将源代码,汇编器和输出一次全部存储在内存中(在我的Commodore 64上,我使用的汇编程序发布在Compute的Gazette杂志中,就像那样工作) .

尽管重新组装所有内容的地址更改可能对于“接管机器”的程序是实用的,但在许多情况下,最好使用多步骤过程,其中源文件被处理为目标代码文件,其中包含汇编指令,但也包含各种关于它们的“象征性”信息;然后以各种方式处理这些文件,以便产生可以直接加载到内存中的内存映像,或者是一个组合的可重定位目标文件,操作系统的加载器将知道如何调整它可能加载到的任何地址 .

为了使对象链接系统有用,它必须允许延迟某些类型的地址计算,直到链接或加载程序 . 一些系统仅允许在链路/加载时执行极其简单的计算,而其他系统允许更复杂的计算 . 当它们可行时,更简单的方案可能更有效,但它们的局限性可能会迫使解决方法 . 例如,将使用BX循环小于256字节的数据结构的例程可能被写为:

mov bx,StartAddr

lp:mov al,[bx] ...做一些计算inc bx cmp bl,

可以使用 cmp bx,(StartAddr+Length) ,但如果编译工具可以支持它,那么仅比较低字节会更快 . 另一方面,某些16位汇编/链接工具可能要求所有地址修复都使用存储在代码中的16位地址来完成 .

由于不同的系统允许其对象代码格式中的不同功能,因此它们需要在其汇编语言中使用不同的功能来控制它们 . 指令集可以由芯片制造商指定,但是用于表示可重新定位的地址计算的特征通常不是 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值