汇编笔记1(基础知识)

主要跟小甲鱼老师的视频和王爽老师的书学习汇编,膜拜小甲鱼老师。

第一章 基础:

寄存器:cup里的存储器,存放指令和数据。

存储器:存放指令和数据。硬盘和内存都是存储器。

存储单元(从0开始)

总线:

     地址总线:寻址能力,(64位与32位区别)n根地址(一根1个字节=1个内存单元)

     控制总线:cpu对外界器件的控制

     数据总线:决定cpu和外界数据传送速度

主板:核心器件

接口:cpu不直接控制外部器件,通过接口卡控制

存储器:

      随机存储器(ram):

      只读储存器(rom):每种硬件有自己的rom

另:1.不同cpu有不同指令集

       2.不同总线来区别二进制数据是什么

       3.cpu看到的是逻辑存储器

检测点暴露的问题:

    1.B:字节=8b:位

     2.一根地址总线对应1B的寻址能力,一根数据总线对应1bit的数据

第二章 寄存器:(8086cpu)

cpu:内部总线连接

   运算器:一次最多处理16位

   控制器:

   寄存器: 最大宽度16位(数据最大值2的16次方-1)

通用寄存器:4个寄存器(AX,BX,CX,DX)可以分为两个独立的8位寄存器。

       高位:H,低位:L

字(word)=2个字节(16位兼容两个8位)

例:mov  ax,bx      把bx移进ax(支持寄存器,段寄存器,数据,内存到寄存器,寄存器到段寄存器,寄存器到内存)(数据到寄存器sp等)

      add   ax,bx      把bx加进ax

物理地址:内存单元的唯一地址

8086内部16位与外部20位冲突解决方法:内部用两个16位合成一个20位(段地址+偏移地址)物理地址=段地址*16(二进制左移4位,16进制左移1位)+偏移地址

段:段的划分来自cpu,内存并没有分段,看需要自己看成不同段

段寄存器(不要忘记*16):

     CS(代码段地址):CS*16+IP(代码偏移地址)    ip=ip+读取的指令长度

修改CS:ip方法:jmp   段地址:偏移地址        jmp ax是令ip=ax

cs+ip决定执行与否,指向则执行,不指向则不执行。

     DS(数据段地址):当前操作的数据可以[偏移地址]的方式引用

     SS(栈寄存器):SS:sp指向栈顶元素(压入sp-,推出sp+)(先动数据)

sp指向栈的最高地址上一位。(格式化只是移指针)(栈空时指到栈外(+2))

     ES:(备用段寄存器)

另:1.汇编指令不区分大小写

        2.从后向前运算

        3.超出位进到其他寄存器(分高低位时高低位之间也无法直接进位:add al,88)

        4.cpu访问内存必须要物理地址

        5.段地址和偏移地址可以指示2的16次方个内存单元

检测点暴露的问题:

       1.不加H表示10进制,需要先转换为16进制;

       2.注意区分mov 和add;

       3.sub ax,bx    把ax减去bx;

dosbox的一些操作: (加不加空格都行)

       1.r  查看、改变cpu寄存器内容   r 寄存器(改变寄存器的值为指定值)

        2.d 查看内存中的内容   d 段地址:偏移地址   n-1(查看该地址开始的n(默认128)个内存单元)

        3.e  改写内存中的内容   e 起始地址 数据 数据。。。

        4.u  将机器指令翻译为汇编指令

        5.t  执行一条机器指令

        6.a  以汇编格式写入机器指令(执行汇编)   a 起始地址(从起始地址开始写入)

        7.p 执行到当前行,有循环则全部执行

        8.q退出dubug

        9.g 执行到某地址;like 断点

第三章 寄存器(内存):

字的存储:分进高字节中(低字节中存不下的存进高字节)

栈:后入先出

push ax:把ax元素压进栈中 push [0]把0的数据压入栈

pop ax:把栈顶推到ax中       pop [0]把数据推到0

push和pop指令可以修改寄存器和内存

栈顶越界问题:向上越界和向下越界

另:1.mov指令访问内存时可以只给出偏移地址(默认ds)

       2.可以用段寄存器表示段地址

       3.debug的t命令在执行修改SS的指令时,下一条指令也紧接着被执行

检测点暴露的问题:

      1.movadd操作的数据量和使用的寄存器有关,相应大小的寄存器调动相应的数据。

      2.e  d a命令都是操作内存的,r是直接操作寄存器的。

      3.使用栈时先设定SS:sp(最高位)

你可能感兴趣的:(汇编笔记1(基础知识))