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];
- Assemble(王爽)——1、2、3章学习记录
- Assemble(王爽)——写在前面
- uva 12124 —— Assemble
- Assemble(王爽)—— 中断(代码例子,测试不了)
- Assemble(王爽)——nasm 和 masm的一些简单区分
- assemble language学习(-)
- HDU2333 Assemble(二分)
- POJ3497 Assemble(二分)
- assemble
- Assemble
- Assemble
- 【ROS学习记录——1】ROS学习资料记录
- Swift 学习记录—1
- Assemble Language Programming(第九章)
- [JavaWEB]Rest学习记录——Jersey学习(2)
- [JavaWEB]Rest学习记录——Jersey学习(1)
- UVA 12124 - Assemble(二分)
- LA3971-Assemble(贪心+二分)
- 通过应用实例讨论Java多态的实现
- android内部存储器和外部存储器
- gcc static静态编译选项提示错误修正(/usr/lib/ld: cannot find -lc)
- 线性结构的特点
- C语言可变参数解析
- Assemble(王爽)——1、2、3章学习记录
- uva 10474
- ProgressBar的各种样式
- 提高BSEG簇表处理效率
- ABAP日期操作大全
- vc响应最大化最小化按钮的事件或消息 .
- wikipedia c language -c99
- android 下载编译环境配置
- 为学Linux,我看了这些书