8086cpu汇编语言(王爽第三版1-8章总结)

8086cpu汇编语言(王爽第三版1-8章总结)

一、基础知识
1、汇编语言的组成:汇编指令(机器码的助记符)、伪指令、其他符号
2、计算机中连接CPU和其他芯片的导线成为总线,总线从逻辑上分为三类:地址总线、控制总线、数据总线
地址总线:寻址能力(一个CPU有N个地址总线,那么这个cpu最多可以寻找2的N次方个内存单元)
数据总线:数据总线的宽度决定了cpu和外界的数据传送速度
控制总线:决定CPU对外部器件的控制能力
3、每一种CPU都有自己的汇编指令集

二、寄存器
1、不同的CPU寄存器个数和结构不同。8086有14个寄存器,都是16位,可以存放两个字节
2、通用寄存器 AX、BX、CX、DX(为保证兼容,均可分为两个独立的8位寄存器使用,AL、AH)
3、8086cpu给出物理地址的方法:段地址x16+偏移地址
4、段寄存器 CS、DS、SS 、ES
5、CS和IP: cs为代码段寄存器,ip为指令指针寄存器【任何时刻,CUP将CSx16+ip指向的内容当做指令执行】 jmp 段地址:偏移地址(修改cs:ip) jmp 寄存器(修改ip)
6、Debug常用指令:

		R:查看或改变寄存器内容
		D:查看内存中的内容
		E: 改写内存中的内容
		U:将内存中的机械指令翻译成汇编指令
		T: 执行一条指令
		A:在内存中写入汇编指令

三、内存访问
1、DS和【address】:存放数据 ds:【bx】(均能识别) ds:【1】(masm无法识别) ds:【0】均能识别
2、mov、add、sub 转移:mov ax,1000H (ax)=1000H 加:add ax,ax (ax)=2000H 减: sub ax,ax (ax)=0
3、栈:先进后出 push入栈,pop出栈 (8086CPU入栈和出栈以字为单位进行) push ax push bx pop bx pop ax (通常用来暂时保存数据)
4、SS:SP:任意时刻,ss:sp始终指向栈顶元素(空栈时,ss:sp指向最底部字单元偏移地址+2)

四、程序的编译和运行
1、

asssume cs:codesg    
			 	   codesg segment
			  start:mov ax,0123H
					...
					...
					
					mov ax,4c00H    ;程序返回
					int 21h
					
					codesg ends   ;codesg结束
					
					end start    ;指明程序入口【end 汇编程序的入口】

2、masm使用: 注意:!debug 默认十六进制 masm默认十进制 debug中:mov ax,1000和 mov ax,1000h 等价 , masm中: mov ax,1000和mov ax,3e8h等价
编译:masm 路径;
连接:link 路径;

3、单步调试: debug 路径.exe 【程序加载后,ds:0为程序内存区 ,前256个字节为PSP区(psp段地址SA),SA+ 10h:0 是程序的物理地址 】
-t 单步执行,显示寄存器信息
-p 执行最后的int 21h 指令

五、循环
1、ds:【1】masm会误认为是ds:1 ,所以引入bx , mov bx,1 ds:【bx】
2、loop循环:
mov cx,循环次数
s:循环体
loop s
//每次执行loop:(cx)=(cx)-1, 判断cx值,为0向下执行,不为0继续循环
3、段前缀:
【bx】的默认段寄存器是ds ,也可以显示的指明段地址,cs:【bx】,es:【bx】
4、安全的内存空间:
0:200-0:2ff (256个字节)

六、包含多个段的程序
1、db:定义字节型数据,dw:定义字型数据,dd:定义双字型数据
2、数据段、代码段与栈段:

assume cs:codesg,ds:datasg,ss:stack   ;定义代码段,数据段和栈段
				
			datasg segment	;数据段开始
				db ...
			data ends			;数据段结束
				
			stack segment  ;栈段开始
			  dw ...
			stack ends		;栈段结束
			
			code segment  ;代码段开始
start:
			...
			mov ax,4c00h	;程序返回
			int 21h	
			code ends     ;代码段结束
			
			end start ;指明程序入口

七、更灵活的定位地址内存的方法
1、and、or : 1and1=1 1and0=0 1or0=1
2、大小写转化问题:小写字母第五位为1,大写字母为0
小转大:and 11011111B
大转小:or 00100000B
3、bx+idata: 如 bx+1,bx+200
常用格式: 【bx+100 】、100【bx】、【bx】.100
4、bx+si、bx+di
一般情况下: si指向原始偏移地址,di指向目标偏移地址
【si、di和bx功能一样,但si和di不能分成两个8位寄存器使用】

八、数据处理的两个基本问题【在什么地方?有多长?】
1、reg和sreg: reg寄存器:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di
sreg段寄存器:ds,ss,cs,es
2、bp:【bp】如果没有显示的给出段地址,默认为ss ,而其他,【bx】,【si】,【di】,【0】默认都为ds
3、在什么地方?
执行指令前,所处理的数据可以放在三个地方: cpu内部、内存、端口
4、8086cpu寻址方式:

				直接寻址:【idata】
				寄存器间接寻址:【bx】、【si】、【di】、【bp】
				寄存器相对寻址:【bx+idata】、【si+idata】、【di+idata】、【bp+idata】
				基址变址寻址:【bx+si】、【bx+di】、【bp+si】、【bp+di】
				相对基址变址寻址:【bx+si+idata】、【bx+di+idata】、【bp+si+idata】、【bp+di+idata】

5、有多长?
8086可以处理byte或word型数据
(1)、通用寄存器指明 mov bx,ds:[0] 字 mov bl,ds:[0]字节
(2)、word ptr 和 byte ptr显示指明 mov word ptr ds:[0],1 字 mov byte ptr ds:[0]字节
(3)、默认:栈push和pop只进行字操作
6、div除法指令:div除数
div reg或div 内存单元
除数:8位或16位 被除数:如果除数是8位,被除数为16位,如果除数是16位,被除数为32位,dx放高16位,ax放低16位
结果:如果除数位8位,al放商,ah放余数;他如果除数为16位,ax放商,dx放余数
【注意!!!无符号16位最大数为65535,8位最大数为255】
mov ax,1000h
mov bx,10h
div bx ;计算ax/bx,bx为除数
7、dup:和db、dw、dd配合使用,进行数据的重复 db 3 dup (0) 等价于 db 0,0,0

小白刚学汇编语言!随手总结

你可能感兴趣的:(8086cpu汇编语言)