汇编总结

寄存器总结
	栈段:		ss:sp
	指令段:	cs:ip
	数据段:	ds
	段寄存器:	es,ss,cs,ds
	循环寄存器:	cx
	空余:		ax,bx,dx,si,di,bp
	寻址:		bx,bp,si,di 
	除法寄存器:	ax,dx
改大写
and al 11011111b
改小写
or al 00100000b

1.数据总线

数据总线:CPU与内存或与其他器件之间的数据传送。	数据总线的宽度决定了CPU与
其他器件进行数据传送时一次数据传送量
	8086CPU数据总线宽度为 16。。。。地址总线20位
地址总线:CPU通过地址总线来指定存储单元,最多可以寻找2的N次方个内存单元。
地址总线的宽度决定了CPU的寻址能力。
控制总线:CPU对外部总线的控制。有多少根控制总线意味着CPU对外部器件有多少种控制。

存储单元从零开始编号,一个存储单元可以存储8bit

2.8086CPU给出物理地址的方法

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位物理地址

读写内存:
	1.CPU中相关部件提供两个16位的地址,一个称之为段地址,一个称之为偏移地址
	2.段地址与偏移地址通过内部总线送入地址加法器
	3.相加合成一个20位物理地址
	4.将20位物理地址送入地址总线
	4.20位物理地址被送入寄存器
物理地址=段地址*16+偏移地址

3.CS:IP

CS:段地址     IP:偏移地址
8086CPU工作过程:
	1.从CS:IP指向的内存单元读取指令,读取的指令进入地址缓冲区
	2.IP=IP+所读取指令长度,从而指向下一条指令
	3.执行指令
	8086CPU刚启动时指向   CS=FFFFH     IP=0000H

4.CPU的栈机制

段寄存器:SS     寄存器:SP
任意时刻,SS:IP指向栈顶元素
Push as执行
	1.SP=SP-2,SS:SP指向当前栈顶前面的元素(一个存储单元为8bit ,
	一次送入一个字(16bit),两个字节)
	2.将AX的数据送入  

5.Push与Pop

指令的格式:
		push 寄存器
		push 段寄存器
		push 内存单元
		例:
			push [0]
	将 10000H--1000FH 这段空间当作栈
		mov ax,1000H
		mov ss,ax
		mov sp,0010H
	如果将 10000H--1FFFFH这段空间当作栈段此时     SS=1000H    SP=0000H

6.描述性符号()

(ax):ax中的内容
mov ax,[bx]       [bx]:段地址默认在 ds   偏移地址 bx   这句话:(ax)=((ds)*16+(bx))	
inc :自加一

7.Loop指令

格式   loop 标号
两部操作:
	1.(cx)=(cx)-1
	2.判断cx中的值,不为零则转至标号处,否侧向下执行
编程123*236,存到ax中
	assume cs:code
	code segment
		mov ax,0
		mov cx,236
	s:	add ax,123
		loop s
		mov ax,4c00h
		int 21h
	code ends
	end

8.各种寻址方式

【bx+idate】:  mov ax,[bx+200]    (ax)=((ds)*16+(bx)+200)
【bx+si】或【bx+di】:   mov ax,[bx+si]     (ax)=((ds)*16+(bx)+(si))
【bx+si+idate】或【bx+di+idate】:  mov ax,[bx+si+idate]     
	 (ax)=((ds)*16+(si)+idate)

9.寄存器使用

可以放到  【】中的寄存器只有 bx bp di si
只能由一下表现形式:
	mov ax,[bx]
	mov ax,[bp]
	mov ax,[si]
	mov ax,[di]
	mov ax,[bx+si]
	mov ax,[bx+di]
	mov ax,[bp+si]
	mov ax,[bp+di]
	mov ax,[bx+si+idate]
	mov ax,[bx+di+idate]
	mov ax,[bp+si+idate]
	mov ax,[bp+di+idate]
bx与bp不同之处
bx:默认段地址在   ds中
bp:默认段地址在   ss中

10.div 指令

div:是除法指令    
注意:
1.除数:有八位或者十六位,在一个reg中或者存储单元中
2.被除数:默认放到AX或者DX与AX,如果除数是八位,则被除数是16位,
默认在AX中;如果除数是16位则被除数是32位
在DX与AX中,DX存放高16位
3.结果:如果除数是8位,则AL存放操作的商,AH存放余数;如果除数是16位,
则AX存放商,DX存储操作的余数

例子:
div byte ptr ds:[0]
	含义:(al)=(ax)/((ds)*16+0))  商
		(ah)=(ax)/((ds)*16+0))   余数
div word ptr es:[0]
	含义:(ax)=[(dx)*10000H+(ax)]/((es)*16+0)  商
		(dx)=[(dx)*10000H+(ax)]/((es)*16+0)  余数
div byte ptr [bx+si+8]
	含义:(al)=(ax)/((ds)*16+(bx)+(si)+8))  商
		(ah)=(ax)/((ds)*16+(bx)+(si)+8))   余数
div word ptr [bx+si+8]
	含义:(ax)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)  商
		(dx)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)  余数
计算  100001/100
	mov dx,1
	mov ax,86A1H
	mov bx,100
	div bx

11.伪指令dd

data segment
		db 1	//字节型
		dw 1	//字型
		dd 1	//双字型
	data ends

12.dup

db 3 dup (0)
定义三个字节   相当于  db 0,0,0
db 3 dup(0,1,2)
定义了九个字节
相当于 db 0,1,2,0,1,2,0,1,2

13.ret与retf

ret:修改IP内容,实现近转移
retf:修改CS IP 实现远转移

CPU执行ret时执行两条指令
1.(IP)=((ss)*16+sp))
2.(sp)=(sp)+2
CPU在执行retf时
1.(IP)=((ss)*16+(sp))
2.(sp)=(sp)+2
3.(cs)=((ss)*16+(sp))
4.(sp)=(sp)+2

14.标志寄存器

1.ZF标志--零标志位
		如果结果为零  ZF=1    
	2.PF标志--奇偶标志位
		所有bit 位1的个数   为偶数    PF=1
	3.SF标志--是否为负
		为负    SF=1
	4.CF 标志  是否有进位
	5.OF 标志  有无符号

1.用 SI,DI 将字符串“welcome to masm!"复制到他后面的区域

assume cs:code,ds:dsta
data segment
	db 'welcome to masm!'
	db '................'
data ends

code segment
start: mov ax,data
	mov ds,ax
	mov si,0
	mov di,16
	mov cx,8
s:	mov ax,[si]
	mov [di],ax
	add si,2
	add di,2
	loop s
	mov ax,4c00H
	int 21H
code ends
end start

2.将单词的每一个首字母改为大写

assume cs:code,ds:data
data segment
	db '1. file          '
	db '2. file          '
	db '3. file          '
	db '4. file          '
	db '5. file          '
	db '6. file          '
data ends
code segment
start:	mov ax,data
	mov ds,ax
	mov bx,0
	mov cx,6
s:	mov al,[bx+3]
	and al,11011111b
	mov [bx+3],al
	add bx,16
	loop s
	mov ax,4c00H
	int 21H
code ends
end start

将单词改为大写

assume cs:code,ds:data
data segment
	db 'file             '
	db 'file             '
	db 'file             '
	db 'file             '
	db 'file             '
	db 'file             '
data ends
code segment
start:	mov ax,data
	mov ds,ax
	mov bx,0
	mov cx,6
s1:	mov si,0
	mov di,cx
	mov cx,4
s2:	mov al,[bx+si]
	and al,11011111b
	mov [bx+si],al
	add si,1
	loop s2
	mov cx,di
	add bx,16
	loop s1
	mov ax,4c00h
	int 21H
code ends
end start

3.计算第一组数据的三次方

assume cs:code
data segment
dw 1,2,3,4,5,6,7,8
dd 0,0,0,0,0,0,0,0
data ends
code segment
start: mov ax,data
	mov ds,ax
	mov si,0
	mov di,16
	mov cx,8
s:	mov bx,[si]
	call cube
	mov [di],ax
	add si,2
	add di,4
	loop s
	mov ax,4c00h
	int 21h

cube: mov ax,bx
	mul bx
	mul bx
	ret
code ends
end start

4.将一个 以零结尾的字符串全部改成大写

capital:	mov cl,[si]
		mov ch,0
		jcxz ok
		and byte ptr [si],11011111b
		inc si
		jmp short captical
	ok:	ret


assume cs:code
data segment
	db 'word',0
	db 'word',0
	db 'word',0
	db 'word',0
data ends
code segment
start: mov ax,data
	mov ds,ax
	mvo bx,0
	mov cx,4
	s:mov si,bx
	call captical
	add bx,5
	loop s
	mov ax,4c00h
	int 21h
captical:mov cl,[si]
	mov ch,0
	jcxz ok
	and byte ptr cx,11011111b
	inc si
	jmp short captical
ok:	ret
code ends
end start
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值