c语言学习笔记十

内存与地址
 32位x86 ,从0x0000 0000到0xffff ffff


cpu的功能单元:
 寄存器:register,高速存储器,像内存一样存取数据
         eax 通用寄存器 
         ebx
         ecx
         edx
         edi
         ebp
         eip 程序计数
         
 程序计数器:program counter,
 指令解码器:instruction decoder
 算术逻辑单元:arithmetic and logic unit
 地址和数据总线:bus
 
  示例:访问内存读取数据
   cpu 将寄存器对接到数据总线上,使寄存器每一位对接到一条数据线,等待接收
   cpu 将内存地址通过地址线发给内存,控制线发请求
   内存收到地址和请求后,将对应存储单元对接到数据总线的另一端,发送到寄存器
    中的相应位.


mmu (memory management unit 内存管理单元)
 如果处理器没有mmu或没有启用,cpu执行单元发出的内存地址将直接传到内存芯片引


脚上,这称为物理地址
 从cpu到mmu的地址称为虚拟地址




x86汇编程序基础
 示例代码:
.data
        msg : .string "Hello, world!\n"
        len = . - msg
.text
.global _start


_start:
        movl $len, %edx
        movl $msg, %ecx
        movl $1  , %ebx
        movl $4  , %eax
        int $0x80


        movl $0  , %ebx
        movl $1  , %eax
        int $0x80
  
   生成止标文件:as hello2.s -o htllo.o
   链接生成可执行文件:ld hello2.o -o hello2
   执行文件:./hello2


示例程序(求一组数的最大数)
 .section .data
  data_items:
        .long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
.section .text
.globl _start
_start:
 
  movl $0, %edi
  register


  movl data_items(,%edi,4),
  of data
 
  movl %eax, %ebx
   item,%eax is


start_loop:
  cmpl $0, %eax
 end
 
 je loop_exit
   incl %edi
   movl data_items(,%edi,4), %eax
   cmpl %ebx,%eax
   jle start_loop


 new
 
   movl %eax,%ebx
   jmp start_loop
 
 loop_exit:
    movl $1, %eax
    int $0x80








寻址方式:
  直接寻址:使用address_or_offset寻址,例:movl address,%eax
  变址寻址:movl data_items(,%edi,4), %eax
  间接寻址:movl (%eax),%ebx
  基址寻址:movl 3(%eax),%ebx
  立即寻址:movl $10,%eax
  寄存器寻址:

你可能感兴趣的:(c,汇编,存储,语言,X86)