汇编指令分类

匆匆过客 提交于 2019-12-04 23:23:30

汇编

汇编语言包含两种指令:

  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'

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!