スタックを用いたサブルーチンへの引数渡し

アセンブリコード

; subcall.asm
;
; サブルーチンにスタックを使用してパラメータを渡す
; void subRoutine(char, char)といったところか

  bits 16
  org 0x100
  
  mov ax, 0x0200 ; これはグローバルにアクセス可能とする
  
  mov bx, 0x41   ; パラメータその1
  mov cx, 0x42   ; パラメータその2
  
  push bx        ; サブルーチンではこの順番と逆に受け取る
  push cx        ; 8bitのレジスタはpushできない
  
  call subRoutine
  
  mov ax, 0x4C00
  int 0x21

subRoutine:
  push bp        ; ベーシックポインタをとりあえず保存
  mov bp, sp     ; スタックポインタを移す
  sub sp, 0x40   ; 現時点ではおまじない、残念
  
  mov cx, [bp+4] ; パラメータその2
  mov bx, [bp+6] ; パラメータその1
  
  mov dx, bx     ; 表示させるためにコピー
  int 0x21       ; レジスタAXはグローバルな感じで
  mov dx, cx
  int 0x21
  
  mov sp, bp     ; "sub sp, 0x40"の取り消しらしい
  pop bp
  ret            ; 呼び出し元へ復帰する

実行結果

D:\asmwork>nasm -f bin subcall.asm -o subcall.com

D:\asmwork>subcall.com
AB
D:\asmwork>

"sub sp, 0x40"というのがまだ良く分からない.再起呼び出しをするサブルーチンを作ろうとしたが現時点では出来ず.