汇编语言基础学习笔记.docx
- 文档编号:23351101
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:9
- 大小:17.98KB
汇编语言基础学习笔记.docx
《汇编语言基础学习笔记.docx》由会员分享,可在线阅读,更多相关《汇编语言基础学习笔记.docx(9页珍藏版)》请在冰豆网上搜索。
汇编语言基础学习笔记
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中的值并未改变。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 基础 学习 笔记