zoukankan      html  css  js  c++  java
  • 汇编指令分类

    汇编

    汇编语言包含两种指令:

    1. 汇编指令
    2. 伪指令

    伪指令

    没有对应的机器指令,最终不会被CPU执行。伪指令是编译器执行的指令。

    segement和ends

    segement 表示一个段的开始,ends表示一个段的结束

    段名 segment
    段名 ends
    
    比如:
    codesg segement
    codesg ends;
    

    end

    表示一个汇编程序的结束标记,编译器在编译的时候如果碰到了end,就会结束对源程序的编译

    assume

    假设某一段寄存器和程序中的某一个用segment...ends定义的段相关联。

    标号

    一个标号指代了一个地址,

    步过循环p

    遇到loop使用p来进行跳过

    跳到指定的语句g ip

    使用g ip跳到指定语句

    start 告诉程序的入口

    assume cs:code
    code segment
    	
    		dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
    
    start:  mov bx, 0    ; 跳过前面的数据,不加start代码会从数据处开始
    		mov ax, 0
    
    		mov cx, 8	
    		s:add ax, cs:[bx]
    		add bx, 2
    		loop s
    
    		mov ax, 4c00h
    		int 21h
    
    code ends
    end start
    

    汇编指令

    汇编只有是有对应的机器码的指令,可以被便以为机器指令,最终为CPU所执行。

    loop

    assume cs:code
    
    code segment
    
    	mov ax,2
    
    	mov cx,11
    s:	add ax,ax
    	loop s
    
    	mov ax, 4c00H
    	int 21H
    
    code ends
    
    end
    

    loop 执行之后,寄存器cx会自动减一,直到减到0,跳出循环执行loop的下一条语句

    段前缀 ds, cs, ss, es

    指令mov ax, [bx]中,内存的那元的偏移地址由bx给出,而段地址默认在ds中。我们可以在访问内存单元的指令中显式地给出内存单元的段地址所在的段寄存器。

    例如

    mov ax, ds:[bx]
    mov ax, cx:[bx]
    mov ax, ss:[bx]
    mov ax, es:[bx]
    mov ax, ss:[0]
    mov ax, cs:[0]
    

    [bx+idata]

    表示一个内存单元,偏移地址+idata = 新的偏移地址

    常用格式, 下面的写法都是将bx + 200

    mov ax, [200 + bx]
    mov ax, 200[bx]
    mov ax, [bx].200
    

    SI和DI

    SI和DI是8086CPU中和BX功能相近的寄存器

    下面3组指令实现了相同的功能

    ; 1
    mov bx, 0
    mov ax, [bx]
    ;2
    mov si, 0
    mov ax, [si]
    ;3
    mov di, 0
    mov ax, [di]
    

    [bx + si]和 [bx + di] 的用法一样

    [bx + si]表示一个内存单元,它的偏移地址为(bx) + (si)(即bx中的数值加上si中的数值)

    常用格式

    ;1
    mov ax, [bx + si]
    ;2
    mov ax, [bx][si]
    

    [bx + si + idata]和[bx + di + idata]的用法一样

    [bx + si + idata]表示一个内存单元,它的偏移地址为(bx) + (si) + idata(即bx中的值加上si中的值再加上idata)

    常用格式

    ;1
    mov ax, [bx + 200 + si]
    ;2
    mov ax, [200 + bx + si]
    ;3
    mov ax, 200[bx][si]
    ;4
    mov ax, [bx].200[si]
    ;5
    mov ax, [bx][si].200
    

    通过and和or转换大小写

    转换为大写

    and al, 11011111b

    转换为小写

    or al, 00100000b

    reg表示寄存器sreg表示段寄存器

    reg的集合包括:ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di

    sreg的集合包括:ds, ss, cs, es'

  • 相关阅读:
    2、selinux服务的操作
    1、添加nginx到全局变量中
    linux每日命令(1):which
    QT重载基类绘制函数并在基类绘制结果基础上进行子类的绘制
    QT信号槽无法正常通信的原因
    mapgis6.7+加密狗+二次开发SDK库
    KMP算法参考及C语言实现
    elastic search
    RabbitMq docker集群
    RabbitMq安装
  • 原文地址:https://www.cnblogs.com/songyaqi/p/11888051.html
Copyright © 2011-2022 走看看