汇编--简单的子程序调用

发布时间 2023-11-28 23:43:55作者: lmj625

前言

本文将以十进制转二进制以及二进制转十进制为例,展示汇编子程序的基本语法。



程序要求

使用两个子程序,定义一个变量a=156,一个8字节的DB型数组变量Bin_Arr,一个2字节的DB型数组Hex_Arr。
(1)子程序1:将a转换为8位二进制数存入Bin_Arr中。
(2)子程序2:将Bin_Arr中的二进制数转换为两位16进制数9CH。



思路

十进制转二进制

辗转相除法,div指令。需要注意的是,div的被除数自动绑定在ax寄存器,除数为2,使用8位寄存器即可,所以相除所得余数存于ah,商存于al。那么每次要记得重新给ax赋值。


二进制转十六进制

4个二进制组成1个十六进制,那么从低位开始扫描,一个数用来记录当前二进制位所代表值(1,2,4,8),同时一个数用来累加,累加条件是当前位为1。
最后转换成ascii码,就是数字+‘0’,字母+‘a’。但注意是从a(即十进制的10)才开始转换,所以要先-10才能+‘a’。



代码实现

数据段定义

data segment
a db 156
Bin_Arr db 8 dup(?)
Hex_Arr db 2 dup(?)
data ends
  • dup 是一种用于定义数据段中重复元素的指令

这样最初的内存就会是:
image


十进制转二进制子程序

toBin proc
    mov al,a
    mov ah,0
    lea si,Bin_Arr
    add si,7
    mov cl,2
lop:
    div cl
    mov [si],ah
    mov bh,0
    mov bl,al
    mov ax,bx ;重新赋值
    dec si
    cmp al,0
    jne lop
    ret
toBin   endp
  • 其中,子程序的必要结构是:
子程序名 proc
    ...#代码逻辑
    ret
子程序名   endp

运行结果

image


二进制转十六进制子程序

toHex proc
    add si,3
    mov ax,1
    mov bx,0
    mov cx,4
lop2:
    cmp byte ptr[si],0
    je  notadd
    add bx,ax
notadd:
    shl ax,1
    dec si
    loop lop2
    cmp bx,9
    ja  tochar
    add bx,'0'
    jmp toend
tochar:
    sub bx,10
    add bx,'A'
toend:
    mov [di],bx
    ret
toHex endp

运行结果

image


main程序

  • 使用call命令+子程序名调用子程序
  • 第二个子程序调用之前需要准备参数,使其能够从每个字节的低位开始运算。
main proc
    mov ax,data
    mov ds,ax
    call toBin

    lea si,Bin_Arr
    lea di,Hex_Arr
    call toHex

    lea si,Bin_Arr
    add si,4
    lea di,Hex_Arr
    inc di
    call toHex

    mov ah,4ch
    int 21h
main endp