------------------------------------------------------------
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
------------------------------------------------------------