orange's学习--汇编一些知识点

本文详细对比了16位与32位汇编语言在操作系统、指令集、寄存器使用及文件格式上的差异,阐述了它们在代码长度、寻址能力及操作权限的不同。

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

------------------------------------------------------------
16位段和32位段的区别是什么?

MASM把USE16、USE32用在SEGMENT后面来说明段的属性,NASM用 
[SECTION   .s16] 
[BITS   16] 
和 
[SECTION   .s32] 
[BITS   32] 

16位代码段最长只能为64k,段内偏移量为16位,默认的指令地址及操作地址为16位; 
32位代码段最长可以4G,   段内偏移量为32位,默认的指令地址及操作地址为32位。 
是否能够使用eax,edx 等寄存器与是否使用16位代码段及32位代码段无关。16位代码段、32位代码段都可以使用eax,edx等寄存器。 

16位段和32位段的区别是机器码的区别,主要体现在对MOD/RM的解释上(对SIB也有影响,暂且不提) 
IA32的机器码: 前缀+操作码+MOD/RM+SIB+Displacement+立即数 
其中MOD/RM是操作数的主要组成部分,表示需要访问的寄存器/内存,在16位和32位模式下,CPU对于MOD/RM的解释有很大的区别。


------------------------------------------------------------
16位操作系统与32位操作系统的80x86汇编语言主要区别如下:
16位操作系统中的程序运行在RING0级,也就是说普通程序和操作系统程序运行在同一个级别并且拥有最高权限。
而32位操作系统中的程序一般只拥有RING3级别运行权限,程序的所有操作都受到操作系统控制,若程序要获得RING0操作特权只能通过驱动程序实现。
16位操作系统的可执行文件格式和32位操作系统的可执行文件格式不同,在32位的Windows操作系统中,可执行文件的格式加PE格式,32位的Windows操作系统运行在CPU的保护之上,而16位的系统则运行在CPU的实模式上。


------------------------------------------------------------
ret和retf指令区别:(汇编有很多其他指令都是只有一点点区别)
ret 用栈中数据改IP内容,近转移;retf用栈中数据同时改CS,IP,远转移
用汇编解释
ret   ->  pop ip

retf  ->  pop ip
          pop cs


------------------------------------------------------------


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值