汇编(一)

来源:互联网 发布:编写小说的软件 编辑:程序博客网 时间:2024/05/15 13:02

知识来源于网络,作者整理,仅用于复习
学习编译时看到的非常好的博客随笔 http://www.cnblogs.com/secondtonone1/category/922609.html

**一·寄存器**8086说明

   寄存器相当于中转站   8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。  1.通用     根据自己的意愿使用    数据寄存器    指针寄存器和变址寄存器    AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据。    SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置    BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置 2.指令指针IP 指令指针IP是一个16位专用寄存器,它指向当前需要取出的指令字节 3.标志寄存器 4.段寄存器   CS(Code Segment):代码段寄存器 DS(Data Segment):数据段寄存器注意:***当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置***,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 5.程序计数器 程序计数器是用于存放下一条指令所在单元的地址的地方。

当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析指令,执行指令。完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。
将内存单元的内容复制到寄存器中的动作——装载,将cpu中寄存器的数据copy到内存中——存储。
不是所有的寄存器都可以被开发者使用,提供给程序员的寄存器为通用寄存器。

二·汇编

这里写图片描述

一般格式为:
标号:语句助记符,操作数;注释
ADDR1:MOV AL,100;//AL寄存器赋值100

注意:mov reg, mem 将内存单元的数据存储到寄存器中
mov mem, reg 将寄存器中的内容存储到内存单元中
但是不能mov mem, mem, 不能将一个内存中的内容存储到另一个内存中 需要通过mov reg, mem1; mov mem2 reg;可达到目的。

1.汇编的hello world!
这里写图片描述
这里写图片描述

这里写图片描述
注释:
汇编语言中中操作数有三种:寄存器操作数、存储器操作数和立即数(imm)。
其中立即数相当于高级语言中的常量(常数),它是直接出现在指令中的数,不用存储在寄存器或存储器中的数,如指令ADD AL,06H中的06H即为立即数

eax为累加器,主要用于参与算术逻辑

ebx为基址寄存器,用于处理数组

ecx为计数器,用于循环操作

edx为数据寄存器,用于算术指令。
加法指令 add 减法指令 sub
乘法指令
乘法指令imul

imul mem 将内存单元mem中的数据和寄存器eax中的数据相乘,结果存储在中
imul reg 将寄存器reg中的数据和寄存器eax中的数据相乘,结果存储在edx:eax中
注意:imul 只有一个参数,这个参数只能为内存单元或者寄存器,不能是imm立即数
由于乘法指令imul可能会造成乘积位数大于乘数和被乘数的位数,所以将结果存储在edx:eax中
imul为有符号的乘法指令, mul为无符号的乘法指令, imul和mul参数只能为mem或reg,如果
想计算num = mem* 3;mem为内存单元数据,3为立即数
imul实现为
mov eax, 3
imul mem
mov num, eax
EDX:EAX,这里表示EDX,EAX连用表示64位数
这里写图片描述
这里写图片描述
C语言中:char name[] = “iloveu”;
汇编中:name byte ‘iloveu’,0 //字符串结汇通常带有二进制的0,占用一个字节