8086汇编语言
title: 8086汇编语言
date: 2020-01-13 13:12:05
tags:
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
推荐阅读
-
i7 8086k怎么样 Intel酷睿i7-8086K处理器详细评测
-
不用定时器和汇编语言,只用C语言实现精确无误的延时
-
1.2万Intel i7-8086K信仰主机配置推荐 高端超频水冷电脑装机方案
-
酷睿i7 8086K配什么显卡好 适合搭配i7-8086K处理器的显卡推荐
-
ARM汇编语言
-
AMD锐龙7 2700X和Intel Core i7-8086K哪款值得买 两款CPU对比评测
-
[BUUCTF]REVERSE——[BJDCTF 2nd]8086
-
汇编语言:编程,将datasg段中的每个单词改为大写字母
-
VisualStudio 2017配置汇编环境&编写汇编语言--For初学者
-
Microsoft Visual Studio配置汇编语言开发环境