汇编-----打印中断码、call&&ret指令

mov ah, 9h int 21h 打印中断

21h中断中的9h中断码代表打印, CPU拿到需要打印的数据, 将其放到显示内存(显存)上,完成打印操作

assume cs:code, ds:data, ss:stack
stack segment
        db 20 dup(1) ; 定义20个字节作为栈段
stack ends

data segment
        db 20 dup(2)
        str db 'hello world!$'
data ends
code segment
start:
      
      mov dx, offset str ;将str这个偏移地址赋给dx
      mov ah, 9h 
      int 21h ;当CPU读取到21H中断中的这个中断中的9H中断码时, CPU会取出dx中所保存的值当做字符数据的偏移地址, 这个时候相当于找到了DS:[20],当读取到  $  时就会结束

      mov ah , 4ch
      int 21h
code end
end start

Call 和 ret 指令

  • Call指令和ret指令要配合使用

    Call 指令, 相当于函数的调用

    • Call 标号来调用
    • 将下一条指令的偏移地址入栈
    • 跳转到定位地址执行指令

    ret 指令: 将栈顶的值pop给IP

    • 任何函数在ret之前都会将函数内部声明的变量pop掉, 用来维持栈平衡, 保证sp指向的是下一条指令的地址
assume cs:code, ds:data, ss:stack
stack segment
        db 20 dup(1) ; 定义20个字节作为栈段
stack ends

data segment
        db 20 dup(2)
        str db 'Hello world!$'
data ends

code segment
start:
      mov ax, data
      mov ds, ax
      mov ax, stack
      mov ss, ax

      mov ax, 1122H
      call print  ;相当于函数调用
      mov ax, 4ch
      int 21h
print: ;为什么要写在中断之后呢?因为code会从上往下依次执行
      mov ax, 3344h 
      push ax ; 进行了push操作后 必须进行pop保持栈平衡, 防止ret时pop的数据不是下一条指令的地址
      mov dx, offset str ; 通过offset将str的偏移地址存入dx
      mov ah, 9h ; 
      int 21h
      pop ax 
      ret
      
code end
end start

你可能感兴趣的:(汇编-----打印中断码、call&&ret指令)