如果要编整个汇编程序,废话不多说,先写上每个程序必有的框架:

data segment
    ; 定义数据
data ends

code segment
assume ds:data,cs:code
start:
    mov ax,data
    mov ds,ax
    ;-----
    ; 这里写主程序,可用call phex来调用子程序phex
    ;-----
    mov ah,4ch
    int 21h

    phex proc
    ; 这里写子程序
    ret
    phex endp

code ends
    end start

p161 例5-1 以16进制形式输出bx寄存器中的数

data segment
    dat dw 0a1b2h ; 16位数
data ends

code segment
assume ds:data,cs:code
start:
    mov ax,data
    mov ds,ax
    ;-----
    mov bx,dat ; 传参给bx
    call phex
    ;-----
    mov ah,4ch
    int 21h

    ; 以16进制输出bx中的16位数
    phex proc
    mov ch,4
    mov cl,4
    lop:
        rol bx,cl ; 循环左移4位,当前最高4位移至最低4位
        mov al,bl ; 暂存至al
        and al,0fh ; 只取最低4位
        add al,30h ; 数字->ASCII码
        cmp al,39h ; 判断是否在数字的ASCII码范围内(数字9的ASCII码是39h)
        jbe print ; <=39h则跳转到分支结构print
        add al,7 ; 否则+7得到表示16进制的字母的ASCII码(字母A的ASCII码是41h)
        print:
            mov dl,al
            mov ah,2 ; 输出dl的ASCII码表示的字符
            int 21h
        dec ch ; ch--,同时置标志位
        jnz lop ; ch!=0则继续循环
    mov dl,0ah ; 换行的ASCII码是0ah
    mov ah,2 ; 输出换行
    int 21h
    ret
    phex endp

code ends
    end start