zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    解决pydev无法增加jython271 interpreter的问题
    使用pygal 做chart图的经验分享
    python4delphi 使用
    Some Delphi tips
    http request method and response codes
    flask 项目的开发经验总结
    解决pydev报unsolved import的问题
    python __future__ package的几个特性
    用一个简单的例子来理解python高阶函数
    正确地组织python项目的结构
  • 原文地址:https://www.cnblogs.com/l0nmar/p/12553873.html
Copyright © 2011-2022 走看看