汇编语言全梳理(精简版)

寄存器一览

  • 通用寄存器
    • ax,bx,cx,dx,(ah,al,bh,bl,ch,cl,dh,dl)
    • sp,bp,si,di
  • 指令寄存器
    • ip
  • 标志寄存器
    • FR
  • 段寄存器
    • cs,ds,ss,es

 

mov

指令 示例
mov 寄存器, 数据 mov ax, 8
mov 寄存器, 寄存器 mov ax, bx
mov 寄存器, 内存

mov ax, [0]

mov ax, [bx]

mov 内存, 寄存器

mov [0], ax

mov [bx], ax

内存地址由 段地址:偏移地址 决定,8086 选择 ds 段寄存器作为默认的段地址

由于段寄存器也是寄存器,除了硬件规定不能直接将数据 mov 到段寄存器之外,其他的和正常寄存器一样

指令 示例
mov 段寄存器, 寄存器 mov ds, ax
mov 寄存器, 段寄存器
mov ax, ds
mov 段寄存器, 内存 mov ds, [0]
mov 内存, 段寄存器 mov [0], ds

变种

  • mov ax, 'a':处理字符
  • mov ax, [bx + 1]:可用作数组操作
  • mov ax, [bx + si]
  • mov ax, [bx + si + 1]
  • mov word ptr [0],1:指定长度为一个字
  • mov byte ptr ds:[0], 1:指定长度为一个字节

 

add / sub

 格式同 mov 一样 

 

mul

计算:其中一个乘数放在 al 或 ax 中,另一个看指令

  • mul reg
  • mul 内存单元

结果:8位相乘结果放在 ax 中,16位相乘结果放在(高位dx 地位ax)中

 

div

  • div 寄存器
  • div 内存单元

除数为 8 位

  ax dx
  ah al  
计算时 被除数全部 16 位  
结果 余数  

 

除数为 16 位

  ax dx
计算时 被除数低 16 位 被除数高 16 位
结果 余数 

 

寻址方式总结

 

push / pop

CPU 取 SS:SP 作为栈顶地址,我们可以自己初始化栈顶地址为 10010H

mov ax, 1000H
mov ss, ax
mov sp, 0010H
指令 步骤
push ax

SP = SP - 2

ax 内容送入栈顶的内存地址

pop ax

栈顶的内存地址的内容送入 ax

SP = SP + 2

push/pop 段寄存器

同理

push/pop 内存单元

同理

另外:pushfpopf 表示将标志寄存器的值压栈和出栈 

 

loop

mov ax, 2
mov cx, 11
s: add ax, ax
loop s

loop s 表示:

  1. cx = cx - 1
  2. 如果 cx 为 0 则继续执行下面的指令
  3. 如果 cx 不为 0 则跳转到标号 s 处

 

定义不同的段,标准示例

assume cs:code, ds:data, ss:stack

data segment
    dw 0001h, 0002h, ... 000fh
data ends

stack segment
    dw 0,0,0,0 ... 0
stack ends

code segment
    ;定义数据段
    mov ax, data
    mov ds, ax
    ;定义栈段
    mov ax, stack
    mov ss, ax
    mov sp, 20h
    ...
code ends

end

 

and / or

  • and al, 10110010B:逻辑与
  • or al, 10110010B:逻辑或

     

db dw dd dup

  • db:定义字节型数据
  • dw:定义字型数据
  • dd:定义双字型数据
  • dup
    • db 3 dup (0) 相当于 db 0,0,0
    • db 3 dup (1,2) 相当于 db 1,2,1,2,1,2

 

跳转指令

jump 类型

  • jump short 标号:根据相对位移跳转 IP = IP + 8 位位移
  • jump near ptr 标号:IP = IP + 16 位位移
  • jump far ptr 标号:CS = 标号所在段的段地址;IP = 标号在段中的偏移地址
  • jump 16位reg:转移地址在寄存器中 IP = (reg)
  • jump word ptr 内存:IP = (内存)
  • jump dword ptr 内存:CS = (内存+2);IP = (内存)
  • jcxz 标号:(cx) == 0 时,(IP) = (IP) + 8 位位移

call 和 ret / iret 类型

  • ret:形象解释相当于 pop IP
    • (IP) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
  • retf:形象解释相当于 pop IP;pop CS
    • (IP) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
    • (CS) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
  • iret:形象解释相当于 pop IP;pop CS;popf
  • call 标号:形象解释相当于 push IP;jmp near ptr 标号
    • (sp) = (sp) - 2
    • ((ss) * 16 + (sp)) = (IP)
    • (IP) = (IP) + 16 位位移
  • call far ptr 标号:形象解释相当于 push CS;push IP;jmp near ptr 标号
  • call 16位reg:形象解释相当于 push IP;jmp 16位reg
  • call word ptr 内存单元:形象解释相当于 push IP;jmp word ptr

子程序标准模板

子程序中使用的寄存器入栈

子程序内容

子程序中使用的寄存器出栈

返回(ret、retf)

 

rep movsb

  • 传送的源地址:ds:si
  • 传送的目的地址:es:di
  • 传输长度:cs
  • 传输方向:cld 为正向

 

端口读取

  • in al, 20h
  • out 20h, al

如 CMOS 有两个端口,70h 是地址端口,71h 是数据端口,所以要读取 CMOS 某存储单元处(2)的数据,就要

mov al, 2
out 70h, al
in al, 71h

 

posted @ 2020-09-16 16:33  闪客sun  阅读(1598)  评论(0编辑  收藏  举报