欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编语言

程序员文章站 2022-04-22 10:58:15
...

汇编语言
视频
http://www.08nm.com/c_29.html
绪论
低级语言
机器语言
二进制
汇编语言
机器语言的升级版
通俗的说,汇编语言就是机器语言的助记符号
编译完成后需要编译成机器语言
高级语言
编译完成后需要编译成机器语言
汇编语言工作过程
程序员
汇编语言
编译器
机器语言
主机
总线
地址总线
cpu有多少根地址总线就是说它的地址总线宽度为N,那么它就可以寻找2的N次方个存储单元(一个存储单元存储8个bit,既一个字节)
控制总线
控制总线的宽度,决定了它的控制能力,比如一根读控制总线可以控制读数据。
数据总线
如果数据总线的宽度为8,那么它一次可以传输一个字节数据,如果宽度为16,那么它可以一次传输两个字节数据。
存储器
计算机的指令和数据都存放到存储器
指令和数据本质没有区别都是二进制数据
RAM
可读可写,速度快,缺点就是需要带电存储
主要是用在主存储器上
ROM
只能读不能写
主要是用在一些BIOS存储上,不需要写入
所有的存储器都被看作一个逻辑存取器,所有它受地址总线的束缚。

			比如我们要向显示器先是数据,CPU就写入数据到显存中,然后才能在显示器显示
寄存器
	cpu
		运算器
		控制器
		寄存器
			数据存储
		内部总线
			连接cpu内部的各个器件
		不同的cpu寄存器的个数不同
			比如8086cpu寄存器有14个
				AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PWD
	通用寄存器
		8086的所有寄存器都是16位的,可以存放两个字节的数据
		16位的cpu说的就是每个寄存器有16位
		AX、BX、CX、DX
			这四个寄存器用于存放一般数据,被叫做通用寄存器
	8086有20根地址总线,但是cpu一次只能输出16位的地址
		所以,8086采取段地址加上偏移地址
			合称为一个20位的物理地址,这样就可以访问20地址总线的内存了
		段地址*16=物理地址
			也就是段地址左移4位
		地址加法器
	段寄存器
		CS、SS、DS、ES
	CS:IP合成一条物理地址,然后读取物理内存中的指令,用来给cpu执行
		在任意时刻,cpu将CS:IP中的内容当做将要执行的指令
		指令指针寄存器
			IP
	一个字单元16位,一个字节单元8位
		一个字由两个字节组成,字节的开始位置就是字的起始位置
	DS寄存器用来放置数据段的起始访问位置,如果不加设置,它默认位置是程序的首地址
	栈顶的段地址存放在SS中,偏移地址存放在SP中,SS:SP存放着指向栈顶的物理地址
编写程序
	下载Dosbox和masm程序
	汇编程序包括两种指令
		汇编指令
		伪指令
	汇编语言编译过程
		编写汇编保存为xxx.asm
			masm xxx.asm编译为.obj
				link xxx.obj文件为.exe文件
					然后执行xxx.exe
	寻址方式
		mov al,[0]表示内存单元偏移地址为0,段地址存放在ds中
			也可以显示的表示段前缀,比如mov al,ds:[0]或者mov al,cs:[0]
		mov al,[bx]表示偏移地址存放在bx中,段地址在ds中
			也可以显示的表示段前缀,比如mov al,ds:[bx]或者mov al,cs:[bx]
			偏移地址也可以这样写mov ax,cs:[bx+200]
				或者mov ax,cs:200[bx]
		BI、SI和bx寄存器功能相近
			但是bi和si不能分成两个8位寄存器使用
				mov ax,cs:[si]
				mov ax,cs:[bx+si]
				mov ax,cs:[bx+si+idata]
		在8086cpu中,只有bx,si,di,bp这四个可以放到[]中用来寻址
			这四个可以单独出现或者以下面四种方式出现其他方式不可以
				bx+si
				bx+di
				bp+si
				bp+di
		只要使用bp并且没有显式的写出段地址,那么段地址存在ss中
	push、pop后面跟着寄存器或者段寄存器或者内存单元,以此来出入栈数据
	在没有寄存器情况下,用word pre声明字操作用byte pre声明字节操作
		mov word pre cs:[0]
		mov byte pre ds:[0]
	转移指令
		offset取得标号的偏移地址
		jmp无条件转移指令
			jmp short 标号
				转移的标号并不会地址,而是IP偏移
			jmp near ptr 标号
			jmp far ptr 标号
			jmp word ptr 内存单元
				单字转移
			jmp dword ptr 内存单元
				双字转移
		jcxz有条件转移指令
			jcxz 标号
		loop循环指令,cx存放着循环次数,cx不为零则循环,为零则跳过循环向下执行
		ret和retf使用栈中的内容实现转移
		call转移指令
	标志寄存器pwd
		ZF零标志为
		PF奇偶标志位
		SF符号标志位
		CF进位标志位
		OF溢出标志位
		abc进位加法运算
		sbb进位减法运算
		cmp是比较指令
		其他转移指令
			je
			jne
			jb
			jnb
			ja
			jna
		DF方向标志位
		pushf、popf标志位入栈或者出栈
	中断
		内中断
			除法错误
			单步执行
			执行into指令
			执行int指令
		外部中断
	端口读写
		cpu控制着其他芯片的读写,读写通过其他芯片的端口实现
		端口读写用int、out
		shl,shr左移和右移
	段寄存器不能相互传递数据,所以要通过通用寄存器周转
		例
			mov ax,cs

mov ss,ax
mov sp,30h这样设置了栈顶ss:sp指向cs:30h的位置
分段写汇编
assume cs:code,ds:data,ss:stack

data segment
dw 0123h,0456h,0789h,0abch,0defh,0cbah,0987h
data ends

stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends

code segment
start:mov ax,stack
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
mov bx,0
mov cx,8

s:push [bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0:pop [bx]
add bx,2
loop s0

mov ax,4c00h
int 21h

code ends

end start
dd定义两个字dw定义字,db定义字节
dup配合定义伪指令使用
dd 3 dup(0)这样定义了三个双字值都是0
div除法默认被除数放在ax或者ax和bx中
mul乘法指令

汇编语言