汇编语言学习笔记
一、16位和32位的80X86汇编语言的区别
需要注意的是汇编不是一种语言,不同平台有不同的汇编语言对应,因为汇编和操作系统平台相关,所以汇编语言没有移植性。对于IA-32架构平台而言,选用的32位80386汇编语言,也就只说讨论的操作系统平台是32位的,可以执行文件的格式也是32位而不是64位或16位的。
实际分析中要知道研究的程序是运行在什么平台上,以选择相应的汇编语言,对应IA-32架构而言,IA-16架构的汇编语言原理其实和IA-32的汇编语言一样,学习过16位的80X86汇编语言的人只需要花一点时间就可以转到32位80386汇编语言上。
16位操作系统与32位操作系统的80x86汇编语言主要区别如下:
16操作系统中的中断调用相当于32位操作系统中的API调用。16位操作系统的中段地址和偏移地址在32位中消失了,在32位操作系统中统一采用平坦的内存地址模式寻址。
16位操作系统中的程序运行在RING0级,也就是说普通程序和操作系统程序运行在同一个级别并且拥有最高权限,而32位操作系统中的程序一般只拥有GING3级别运行权限,程序的所有操作都受到操作系统控制,若程序要获得RING0操作特权只能通过驱动程序实现。
16位操作系统的可执行文件格式和32位操作系统的可执行文件格式不同,在32位的Windows操作系统中,可执行文件的格式加PE格式,32位的Windows操作系统运行在CPU的保护之上,而16位的系统则运行在CPU的实模式上。
什么是IA-32?
IA-32(Intel Architecture),英特尔体系架构,英特尔从486开始采用,也就是X86-32架构,在同一时间内可以处理32位进制数据。CPU的工作宽度是32位。其它公司在软硬件方面都兼容此架构,也列属于IA-32架构。
二、32位汇编教程笔记
1、二进制简写形式是:十六进制
2、数据宽度
A、数据宽度:1位只能存0或1,那么1字节有8位,8位最大值为:1111 1111。用16进制表示为:0至0xFF
B、如果声明的类型为char,那么只能存8位。
3、有符号数和无符号数
区别:
有符号数就是用最高位表示符号(正或负),其余位表示数值大小,无符号数则所有位都用于表示数的大小
有符号数和无符号数是针对二进制来讲的。
有符号数用最高位作为符号位,“0”代表“+”,“1”代表“-”;其余数位用作数值位,代表数值。
比如:
0011 表示 +3;
1011 表示 -3。
无符号数全部二进制均代表数值,没有符号位。即第一个"0"或"1"不表示正负。
比如:
0011 表示 3;
1011 表示 11。
C支持所有整形数据类型的有符号数和无符号数运算。尽管C标准并没有指定某种有符号数的表示,但是几乎所有的机器都使用二进制补码。通常,大多数数字默认都使有符号的,C也允许无符号数和有符号数之间的转换,当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C会隐含地将有符号参数强制转换为无符号数,并假设这两个数都是非负的,来执行这个运算。
作用:
无符号数和有符号数的不同作用在于
1.相同存储空间,可以表示不同的数据范围
2.在程序中不允许有负数的时候,比如表示工资,用无符号数就更好
方法:
输出有符号数与无符号数的方法:(C语言 printf)https://www.runoob.com/cprogramming/c-function-printf.html
4、原码反码补码
如果是正数就用原码存储,如果是负数就用补码存储
原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
反码:正数的反码还是等于原码,负数的反码就是他的原码除符号位外,按位取反。
补码:正数的补码等于他的原码,负数的补码等于反码+1。
5、位运算:与运算、或运算、异或运算、非运算、左移、右移
6、汇编语言就是学:寄存器、内存、指令
7、通用寄存器:
8、