8086汇编语言

8086汇编

储存器:

位于CPU中 ,读写速度最快

寄存器:

区别硬盘 U盘等外部储存器

地址总线

决定CPU的寻址能力,如8386CPU中有20根地址总线,则cpu能访问的储存单元为2的20次方

数据总线

决定cpu一次能够传输数据的位数
8086cpu有16根数据总线

控制总线

决定了cpu对外部设备的控制能力

通用寄存器

数据寄存器:AX BX CX DX

各自的用途:
CX:计数器

指针寄存器SP(堆栈指针) BP(基址指针)

变址寄存器SI(源地址) DI(目的地址)

控制寄存器IP FALG

IP:指令指针

FLAG:标志寄存器

段寄存器 CS DS SS ES

CS:代码段

DS:数据段

SS:堆栈段

ES:附加段
一个寄存器占两个字节(一个字节八位)

AX可分为ALAH高八位和第八位

如:AX:ABCD AH:AB AL:AB

几条汇编指令

MOV指令

mov ax,1200h

ax 00ff

add al,1 后 ax 0000

ADD指令

add ax,ax

SUB指令

Sub ax,1

ax ff00

sub al,1后 ax ffff

寻址

物理地址

即实际地址

物理地址=段地址&10h+偏移地址

  • cs:2000h ip:0033h
  • 物理地址=2000h*10h+0033h=20033h

cs:ffff ip:ffff

物理地址溢出 无效的物理地址

DS和[ADDRESS]

mov ax,[1000h] 即把ds*10h+1000h地址处的数据mov给ax

mov ax,[bx]

先进后出,后进先出

命令 PUSH入栈 POP出栈

push ax (ax入栈)

push 1000h(1000h入栈)

pop bx

pop dx

SS栈顶 SP栈底

ss:sp栈当前指向的位置

push 将数据进栈后 sp-2
pop 将数据出栈后 sp+2

[bx]

mov ax,[bx] ->>ax=[ds*10h+bx]

word ptr 两个字节

deword ptr 四个字节

loop

计算2的11次方

        mov ax,2
        mov cx,10
sign:   add ax,ax
        loop sign

and 和 or 指令

and 与运算

两个同时为1得到1

and ax,ff00h (ax and 11111111 00000000)

两个有一个为1就得到1

or ax,ff00h (ax or 11111111 00000000)

大写字母变小写字母1000001–>1100001

大写字母变小写字母 字符 or 0100000

小写字母变大写字母 字符 and 1011111

内存寻址方式

mov ax,[bx]

mov ax,[bx+100h]

SI DS段偏移地址

DI ES段偏移地址

BP SS段偏移地址

:
SS存放栈的段地址 BP和SP联合使用校准功能

mov ax[100h]

mov ax,[si] ---->ds*10h+si

mov ax,[bp+100h]—>ss*10h+bp+100h

mov ax,[si+bx+100h]—>ds*10h+bx+100h

寻址方式------------格式

直接寻址         [100h]
---------------------------
	      [bx]
寄存器间接寻址    [bp]
			[si/di]
----------------------------
     			[bp+100h]
寄存器相对寻址    [bx+100h]
			[si/di+100h]
----------------------------
基址变址寻址     	 [bx+si/di]
寄存器+寄存器	     [bp+si/di]
----------------------------
相对基址变址寻址   [bx+si/di+100h]
			[bp+si/di+100h]

jmp指令

jmp 地址 直接跳到这一地址

call 和 ret

call 指令

1.将当前 cs ip压入栈中

2.转移

相当于 push ip +jump 地址

或者

push cs

push ip

jmp 地址

ret 指令

pop ip

jump 地址

或者

push cs

push ip

jump 地址

mul 和 div 指令

乘法指令
mul 将al,ax,eax与操作数相乘

 mul abh   -----ab*al 结果储存在al和ah中
 mul abcdh -----abcd*ax 结果储存在ax和dx中
 mul aabbccdd----aabbccdd*eax 结果储存在edx和eax中

除法指令

被除数       除数                   商      余数
ax(16位)	   8位寄存器/八位操作数      al	  ah
dx:ax(32位) 16位寄存器/16位内存操作数 ax     dx
edx:eax(64位)32位寄存器/32位操作数   eax    edx 
ps:除法设计可能有点问题 除数为1 商会溢出.

对前面内容的一点补充

段寄存器

 段      偏移             主要用途
 CS 	 IP              指令的寻址
 SS     SP或BP            堆栈寻址
 DS   BX,DI,SI或16位数    数据的寻址
 ES     串指令的DI         串目标的寻址
 逻辑地址和物理地址

几条指令

	mov ah,ptr byte[bx]
	mov ax,ptr word[bx]
	mov eax,ptr dword[bx]

逻辑运算-按位运算

	and  与    符号"&"
	or   或    符号"|"
    xor  异或  符号"^"
	not  非    符号"~"
	同或  ---

ps 对同一个数异或两次会得到最初未异或的结果 加密解密的过程

标志寄存器

在这里插入图片描述

CF–进位标志.若CF=1,则表示算数运算时产生进位或错位,否则为0.

PF–奇偶标志位.若PF=1,则表示操作结果中"1"的个数为偶数,否则PF=0

AF–辅助进位标志.AF=1表示字节运算时低位向高位进位或借位.否则AF=0

ZF–全零标志.ZF=1表示操作结果全为0否则ZF=0

	sub ax,ax (ZF=1)
	add,sub,div,mul,inc,or,and会影响ZF
	mov pop push不影响

SF–符号标志.SF=1表示符号数运算后的结果为负数.否则SF=0

OF–溢出标志.进行算数运算,结果超出了最大范围,OF=1.否则OF=0

IF–中断允许标志.若IF=1,则可以响应外部可屏蔽中断请求,IF=0则不能.IF状态可以由中断指令来设置

DF–方向标志.DF=1,表示执行字符串操作时按着从高地址到低地址的方向来操作,否则DF=0

TF–单步标志.TF=1时为单步操作,cpu每执行一条指令就进行单步处理中断.若TF=0则继续执行程序.

pushf和popf

pushf把标志寄存器所有的数据入栈

popf把数据弹入标志寄存器

adc

带进位的加

	mov ax,2
	mov bx,1
	sub bx,ax(CF=1)
	adc ax,1(ax+1+CF,ax=4)

sbb

带借位的减法

	sub bx,ax(bx-ax-CF)        

cmp(不保留结果的sub)

	cmp ax,ax(CF=0,PF=1,AF=0,ZF=1,SF=0,OF=0)
	不会发生实际的运算,但会像sub一样影响标志寄存器

test 指令

	test ax,bx与and ax,bx有相同的效果
	但不保留结果只影响标志寄存器.

有条件的跳转指令

	1.标识符offect 取得标号的偏移地址
	2.jcxz 标号 (如果cx=0,则跳转到标号处执行)

更多的:
在这里插入图片描述

	具体的用法:
	mov a,0
	cmp(sub) ax,ax
	je s1
	inc ax
	si:
	inc ax
	je是判断相等的一个跳转指令,当ZF=1时(两数相等),je才会执行
	如以上例子 ax==ax所以 ZF=1 执行je跳转 只执行了一次inc ax 最终ax=1
原文地址:https://www.cnblogs.com/l0nmar/p/12553873.html