汇编语言基础学习笔记.docx

上传人:b****8 文档编号:8957409 上传时间:2023-05-16 格式:DOCX 页数:9 大小:17.98KB
下载 相关 举报
汇编语言基础学习笔记.docx_第1页
第1页 / 共9页
汇编语言基础学习笔记.docx_第2页
第2页 / 共9页
汇编语言基础学习笔记.docx_第3页
第3页 / 共9页
汇编语言基础学习笔记.docx_第4页
第4页 / 共9页
汇编语言基础学习笔记.docx_第5页
第5页 / 共9页
汇编语言基础学习笔记.docx_第6页
第6页 / 共9页
汇编语言基础学习笔记.docx_第7页
第7页 / 共9页
汇编语言基础学习笔记.docx_第8页
第8页 / 共9页
汇编语言基础学习笔记.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

汇编语言基础学习笔记.docx

《汇编语言基础学习笔记.docx》由会员分享,可在线阅读,更多相关《汇编语言基础学习笔记.docx(9页珍藏版)》请在冰点文库上搜索。

汇编语言基础学习笔记.docx

汇编语言基础学习笔记

1.机器指令:

0101010之类的二进制数。

2.CUP把机器指令转换为高低电平驱动(控制)计算机部件运行。

3.汇编语言包括:

a)汇编指令(由翻译软件——编译器翻译成机器指令)

b)伪指令(告诉翻译软件,汇编指令按什么步骤翻译)

c)符号指令:

+-*/(也由编译器执行)

4.指令和数据都2进制形式存储在内存当中。

5.寄存器中1(或2)个字节能存放的最大数是:

a)16进制:

FFh(或FFFFh)

b)10进制:

255(或65535)

所以,movax,65536是错误的。

但是,movax,65535

addax,2//最后ax=0001h;本来应该是10001h,第一个1为溢出位(ax寄存器放不下,但是不代表cpu就扔了,而是存放到其他地方去了)

movah,FF

addah,2//同理,ah=01h;本来应该为101,但是第一位1,但ah寄存器放不下,所以存放到了其他地方。

6.通用寄存器:

ax,bx,cx,dx;它们都是16位寄存器,可以分成两个独立的8位寄存器,可以存放一个字型数据(word=2Byte)。

短地址寄存器:

cs,ds,es,ss

偏移地址寄存器:

bp,ip,sp,si,di,bx

7.物理地址=短地址*10+偏移地址

cpu将cs:

ip所指向(组合成)的地址中的数据当作指令!

8.指令执行的过程:

(1)cpu从si:

ip所指向的内存地址中读取指令,并将这个指令存放到指令缓存器中。

(2)将:

ip=ip+所读指令的字节数

(3)执行指令缓存器中的指令;回到步骤

(1),重复这个过程。

9.转移指令--jump

(1)jump2000:

1000//cs=2000;ip=1000;

(2)jump寄存器//ip=寄存器(中的值)

ps:

不能用mov指令和数据直接修改cs或ip寄存器中的内容:

movcs,2000;//错!

movip,1000;//错!

对cs而言,可以用mov指令间接的修改:

movax,2000;

movcs,ax;

10.汇编程序员,通过汇编指令修改寄存器中的内容来控制cpu,从而控制计算机。

 

11.debug汇编指令调试工具

(1)debug调试指令:

(a)r命令:

查看、修改cpu寄存器的内容。

格式:

-r//查看所有寄存器中的内容

-r寄存器//只查看指定寄存器中的内容

(b)d命令:

查看内存中的内容。

格式:

-d//查看当前cs:

ip所指向的内存及其后连续的79个内存单元中的内容

-dcs:

ip//查看设定的cs:

ip所指向的内存及其后连续的79个内存单元中的内容

-dcs:

ipip//查看设定的cs:

ip所指向的内存到后一个ip所指向的内存。

(c)e命令:

修改内存中的内容。

格式:

ecs:

ip//修设定的cs:

ip内存中的内容。

(d)u命令:

将当前cs:

ip所指向的内存及后续内存中的机器指令翻译成汇编指令,并显示出来。

格式:

-u

-ucs:

ip//将设定的cs:

ip所指向的内存及后续内存中的机器指令翻译成汇编指令,并显示出来。

(f)t命令:

执行一条机器指令。

格式:

-t//执行cs:

ip所指向内存中的指令

(g)a命令:

以汇编指令的格式在内存中写入一条机器指令。

格式:

-a//向当前cs:

ip所指向的内存中写入。

(h)p(pass)命令:

当cs:

ip指向循环体时,可以用p命令一次性运算完循环

(i)g(go)命令:

-gip值//直接运算到cs:

ip所指向的指令处。

12.访问内存单元中数据的方法:

ds:

[偏移地址]

13.内存中数据的长度由寄存器的长度决定。

例如:

a)movbx,2000

b)movds,bx

c)movds:

[0],ax(或者al)//若是ax,那么存放数据时就占用2个字节;

//若是al,就占用1个字节。

d)movax,ds:

[0]//因为ax是16位,所以将ds:

[0]和ds:

[1]这两个连续的内存单元中的内容存放到ax中。

14.汇编指令总结:

a)移动指令:

i.mov寄存器,数据//movax,1000h

ii.mov寄存器,寄存器//movax,bx

iii.mov寄存器,内存单元//movax,ds:

[1]内存单元长度由寄存器大小决定

iv.mov内存单元,寄存器//movds:

[0],ax

v.mov段寄存器,寄存器//movds,ax

vi.mov寄存器,段寄存器//movax,ds

b)运算指令:

add指令:

i.add寄存器,数据//addax,1

ii.add寄存器,寄存器//addax,bx

iii.add寄存器,内存单元//addax,ds:

[0]

iv.add内存单元,寄存器//addds:

[0],ax

sub指令:

i.sub寄存器,数据//subax,1

ii.sub寄存器,寄存器//subax,bx

iiisub寄存器,内存单元//subax,ds:

[0]

iv.sub内存单元,寄存器//subds:

[0],ax

15.程序的执行入口——cs:

ip所指向的内存单元!

16.栈:

一段用于存放字节型数据的连续的内存空间。

a)既然是数据,那怎么对数据进行操作呢?

i.push寄存器//寄存器大小得为1个字!

push段地址:

偏移地址//取一个字大小的内存空间。

上面两个指令表示:

将寄存器/内存空间中的数据送入栈中。

ii.pop寄存器(或段地址:

偏移地址)

同push指令类似,表示从栈顶取出数据送入寄存器/内存空间。

b)上面所说”送入栈“”从栈顶取出“是根据什么呢?

i.ss:

sp永远指向栈顶元素

ii.pushpop指令操作的数据是ss:

sp所指向的字型内存空间中的数据。

c)push寄存器/内存空间过程:

i.sp=sp-2

ii.将寄存器/内存空间中的数据送入ss:

sp指向的内存单元

d)pop寄存器/内存单元过程:

i.将ss:

sp指向的内存单元中的数据送入寄存器/内存单元中

ii.sp=sp+2

17.栈,一段用于存放字型数据的内存空间,那它能有多大呢?

我们不难想到,每次push或者pop都要涉及到栈中的内存单元,

所以,不妨思考下push、pop的运行过程

每次push,sp都要减2,而sp是16位的寄存器,能表示的数的范围为:

0~fffffh,65536个数,与段地址一起对应65536个字节的存储单元,即对应65536/2=32768个字。

所以,栈最大能达到32768个字。

设置栈:

a)长度为16B:

ss:

0+10h=》sp=10h//10h=16哦

b)长度为32B:

ss:

0+20h=》sp=20h//20h=32

c)最大长度——65536B(32768个字):

ss:

0+(ffff+1)h=》sp=0000h//本来为10000h,但装不下,取后四位(但还是表示10000h,那个1存放到其他地方了)——当push32768个元素后,sp=0000,此时栈已经满了,如果再push,那么sp-2=FFFE,也就是说这次push会覆盖之前存放的元素。

18、总结

a)数据在哪里:

内存中

b)怎么访问数据:

i.ds:

[偏移地址]

ii.ss:

sp//指向栈中的数据

c)数据的长度:

字节,字

d)数据的处理:

add,sub

e)数据存放到哪:

通过mov、ss:

sp、ds:

sp、push、pop存放到内存中。

f)数据我们要安排

存放到哪要安排

指令放哪要安排

g)汇编语言包含:

汇编指令、伪指令、符号体系

h)通过汇编指令修改cpu中寄存器的内容,来控制整个计算机

 

[BX]和loop指令

1、bx寄存器和ds寄存器一起表示内存单元的地址——ds:

[bx]

2、loop指令

a)loop是循环指令,与cs寄存器、循环体、标号组成循环

b)cx表示循环次数

c)标号代表一个地址,这个地址所在的内存空间存放着循环体。

d)执行循环的步骤:

i.cs=cs-1

ii.cs不等于0,cs:

ip跳转至标号处,执行循环体

e)循环格式:

movcx,idata//idata表示一个数

标号名:

循环体

loop标号名//先--cs,再执行循环体

3、关于复制:

a)最好不用pop这种方法:

i.1、pop相当于是剪切而非复制

ii.2、有的内存(如:

ffff:

0000~ffff:

000f)中的数据是不能被修改的,所以pop不了!

b)可以用这种土办法:

先ds:

[bx]取数据,再改变ds:

[bx]放数据——就这样循环。

c)用es:

[bx]放数据——————!

复制!

i.建立这样的思维:

ds:

[bx]表示数据在哪里

es:

[bx]表示数据去哪里

其实,ds:

[bx]、es:

[bx]功能都相同,都指向当前表示的内存单元。

————用ds:

[bx]指向要取的内存、es:

[bx]指向要存放的内存

ii.用法:

moves:

[bx],寄存器//将es:

[bx]所指向的内存中的数据存放到寄存器中。

4、存放数据!

可以用push!

但是更应该考虑es:

[bx]!

出现逆序的时候再用push、pop最好!

包含多个段的程序

1、什么时候用什么样的——段寄存器:

偏移地址

a)指令在哪里——cs:

ip

b)栈顶在哪里——ss:

ip

c)数据在哪里——ds:

[bx]

d)数据去哪里——es:

[bx]

e)cs:

[bx],这样也是可以的!

f)ss:

[bx],这样可以吗?

yes!

因为,表示地址的话:

i.[段寄存器]:

[idata]//idata,偏移地址

ii:

[段寄存器]:

[寄存器]

//这里的段寄存器只能是cs、ss、ds、es

//这里的寄存器只能是bx、si、bp、di

2、mov、push、pop指令都是相当于赋值。

例如:

movax,bx//只是将bx中的值赋值给ax,bx中的值并未改变。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2