Assemble(王爽)——1、2、3章学习记录

来源:互联网 发布:阿里云 自定义端口 编辑:程序博客网 时间:2024/06/14 10:31

    首先,是对汇编语言本身、和计算机之间的关系做了个介绍。个人总结:汇编,就是CPU和内存之间的交互。本身来说,计算机就是这样一个功能(其实,还包含各个硬件部件和内存交互,先忽略)。由于汇编贴近硬件,所以,汇编要做的工作就是把计算机的这个功能表达出来——CPU和内存交互。交互,那么CPU和内存之间就需要“通道”:总线。地址总线,数据总线,和控制总线。地址总线将内存地址告知内存,CPU通过数据总线读写一个数据,内存自己知道从哪里取/放到那里去。而内存怎么知道是读还是写呢——控制总线,将一些控制命令传给内存。当然,控制总线还有其他的一些控制信号,我也不知道了。下图,个人觉得很重要。

    

    第二点,讲寄存器。寄存器,段寄存器比较特殊。CS,和IP配合,指定执行的下条指令。而CS中的内容,可以通过jmp来修改(注意:不能通过MOV修改)。DS是数据段,如果你直接对内存进行操作,仅仅指定了偏移地址,那么段地址就在DS中。DS中的内容不能直接指定的,只能通过通用寄存器(AX,BX,CX,DX)赋值给DS,比如:mov ds,ax——就是将ax中的内容赋值给ds。ss+sp来对栈进行操作。当然,ss也是通过通用寄存器间接操作的。(在80x86中),栈操作是两个字节。注意:CPU是不知道栈的边界的,要自己注意!!!

    为了理解栈,自己想了一个C++中的类比情况:

    vector<short> TStack(16);//指定大小——至少现在来看,栈大小是固定的。即使可以扩展,这里也是可以扩展的。

    ss 为 TStack.begin();

    sp 为 TStack.end();

    push 就是 --sp;so->insert();

    pop   就是 *sp; ++sp;

    其中,++/--操作,都是两个字节。push/pop都是不知道边界的(如果需要,可以人为加以限制)。

    第三点,就是一些通用寄存器吧。通用寄存器,可以临时存放点。但是,每个通用寄存器都有一定的特性,一般其他寄存器是没有的。(这点很重要!!!)下面说下我已经知道的几点:

    1、可以对BX指定的内存直接访问,即[BX] ==> BX中内容为address,访问内存address中内容。

    2、CX和loop指令一起用,用于循环的计数——即loop循环的次数是根据CX中的内容来确定的,每次循环代码执行末尾处,就会判断CX值,如果大于0继续循环,否则执行后续代码。

    3、进行系统调用的时候,eax是放中断号,ebx/ecx/edx等依次存放参数。(最后调用int 80执行系统调用)注意,这里是eax,32位的;(ax应该也是这样的吧?待会测试下)

    4、最好不要用内存地址直接对内存访问(可能有问题),放到bx中再访问。

            mov ax,[1];  ==》  效果可能是 mov ax,1;

            所以,最好:    mov bx,1;      mov ax,[bx];


原创粉丝点击