1.移位分为:逻辑移位和算术移位。 左移位表示左边出数据,右移位表示右边出数据。
逻辑移位对于补进来的数据都是0,
算术移位对于补进来的数据分两种情况,如果是算术左移位补进来的始终是0,如果是算术右移位补进来的必须和最高位的数值一致,如果最高为1被进来的就是1,反之亦然。
2.有符号数的十进制和十六进制转换的简单记忆法,可以用环表示来方便记忆。
0的下一位应该是1,0的前一位应该是-1,127的下一位应该是-128,这样就形成一个环,如: ...-1,0,1,2...127,-128...-1,0...,而它对应的十六进制是依次递增的,0(0),1(1),127(0x7F),-128(0x80),-1(0xFF)
3.异或运算:两位相等为0,反之为1,一个位和0进行异或则保持不变;一个位和1进行异或则置反,可以应用这个特性对某个数的某一位进行置反操作。例如:XOR 1234H, 8000H,这是对第31位置反。还可以清0,如XOR AX,AX
4.大端表示法和小端表示法:
CPU产商决定使用大端还是小端,
===============================================================================================
为什么最基本指令只需5个:存取,运算,测试,分支,循环或递归,这是通过数学理论得出,可参考
自动机理论、语言和计算导论
,只要有这5个功能,它就是一个完备的系统,其它功能只是为了方便设计的。
==============================================================================================================
nasm
label: instruction operands ; comment
label后面的冒号可以不写,instruction可以是指令和伪指令
伪指令包括:DB,DW,DD... ; RESB,RESW...; INCBIN; EQU; TIMES
寻址规则是任何对内存中内容的存取操作必须要在地址上加上方括号。但任何对地址值的操作不需要
'$'它本身所在源代码行的开始处的地址
'$$'它当前段开始处的地址
($-$$)它当前在段内的偏移
预处理指令都以%开头,宏指令%define SIZE 100; %macro; %strlen; %substr
===============================================================================================
80x86寻址方式:
8086的物理地址是: 段基址:段内偏移。
段内偏移地址也称为有效地址EA(effective address)
EA=基址+(变址*比例因子)+位移量
立即寻址:mov AL, 31H 不访存
寄存器寻址: mov al , bl 不访存
直接寻址: mov al, DS:[300H]; mov al, ByteVar
寄存器间接寻址
寄存器相对寻址
基址变址寻址
相对基址变址寻址
比例变址寻址
基址比例变址寻址
相对
基址比例变址寻址
gas寻址方式:ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER) [[Linux C.pdf page255]]
FINAL ADDRESS = ADDRESS_OR_OFFSET + BASE_OR_OFFSET + MULTIPLIER * INDEX
movl ADDRESS, %eax #直接寻址
movl data_items(,%edi,4), %eax #变址寻址
movl (%eax), %ebx #间接寻址
movl 4(%eax), %ebx #基址寻址
movl $12, %eax #立即数寻址
movl %eax, %ebx #寄存器寻址
汇编语言所有以.开始的指令都是汇编指示(Assembler Directive), .section .data表示数据段开始,section汇编指示预定义了一些段.data,.text,.bss...
.global汇编指示表示将global后面跟着的symbol对链接器可见,例如.global _start, _start symbol是一个特殊的symbol,程序加载器把它作为程序入口地址。
汇编程序中的symbol经过汇编器都会转换为它表示的地址。
int $0x80是软中断,表示故意在此处产生一个异常(因为int是cpu内部产生的,所以叫异常)
低地址保存整数的低位是小端序,反之为大端序