参考《汇编语言程序设计》
1.每条指令码都是从内存中读取的,指令码所需的数据也是存储在内存中并从内存中读取。
包含指令码的内存字节和包含处理器所用的数据的字节没有区别。
2.区分数据和指令码--数据指针和指令指针。
3.数据指针帮助处理器了解内存中数据区域的起始位置是哪里,这个数据区域称为堆栈。
堆栈指针:用于指向堆栈中的下一个内存位置以便放入或者取出数据。
4.数据表示--小尾数表示法。
4字节表示一个数据值,比如 01 00 00 00,这个值表示1,而不是 64.
5. 高级语言:
long testvalue = 150;
char message[22] = {"This is a test message"};
float pi = 3.14159;
汇编语言:
testvalue:
.long 150
message:
.ascii "This is a test message"
pi:
.float 3.14159
6.执行速度
低级潜在印数的整数执行单元--加法/减法,布尔操作,奔腾4处理在每个时钟周期能够完成两个低级潜在因素的整数操作。
2.复杂整数执行单元,在4个时钟周期之内处理大多数移位和循环指令。
3.乘法和除法操作通常需要花费14-60个时钟周期。
4.浮点执行单元包含处理长度从64位到128位的数据元素的寄存器,应用在数字信号处理和视频压缩上--相对应的指令为MMX和SSE。
7.多线程是针对软件技术。而超线程是针对硬件技术。
8.Intel 的对手 AMD,(本机使用AMD芯片)。
9. Linux 下流行的汇编器是gas,而不是nasm,也不是window环境下的masm。汇编命令是as。
10. 可以将C程序汇编成汇编语言程序。
gcc -S test.c
11.gdb 的图形化界面 - - kdbg
Makefile:
all:
as -gstabs -o hello.o hello.s
ld -dynamic-linker /lib/ld-linux.so.2 -o hello -lc hello.o
#注意加入调试参数-gstabs 可执行文件的大小会变大
#-dynamic-linker 动态地查找和加载库文件的程序
#-lc 加载c库
#break *_start+1
clean:
rm -rf hello
# hello.s ----> intel汇编的注释用的; 而ATT用的#
# display a string "Hello, world."
.section .rodata
msg:
.ascii "Hello, world.\n"
.section .text
.globl _start
_start:
nop #为了断在main上,否则如果断点设置在_start
movl $2, %eax #调用fork系统调用
int $0x80
movl $4, %eax # system call 系统调用号(sys_write)
movl $1, %ebx # file descriptor 参数一:文件描述符(stdout)
movl $msg, %ecx # string address 参数二:要显示的字符串
movl $14, %edx # string length 参数三:字符串长度
int $0x80 # 调用内核功能
pushl $0
call exit
#退出(exit)
#movl $1, %eax # 系统调用号(sys_exit)
#movl $0, %ebx # 参数一:退出代码
#int $0x80 # 调用内核功能