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

8086汇编语言

程序员文章站 2022-04-22 10:53:45
...

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 对同一个数异或两次会得到最初未异或的结果 加密解密的过程

标志寄存器

8086汇编语言

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,则跳转到标号处执行)

更多的:
8086汇编语言

	具体的用法:
	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
相关标签: 逆向