iOS 安全攻防

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

2018-05-04  本文已影响0人  那时J花开

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 指令

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
上一篇 下一篇

猜你喜欢

热点阅读