汇编语言程序设计学习笔记(一)(Linux 版)


参考《汇编语言程序设计》

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         # 调用内核功能


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值