目录
前言
本文将以十进制转二进制以及二进制转十进制为例,展示汇编子程序的基本语法。
程序要求
使用两个子程序,定义一个变量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 是一种用于定义数据段中重复元素的指令
这样最初的内存就会是:
十进制转二进制子程序
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
运行结果
二进制转十六进制子程序
- 注意cmp byte ptr[si],0这句指令不能简单写作cmp [si],0。否则直接报错。在x86汇编语言中,cmp指令通常需要指定操作数的大小,以便确定应该使用字节、字、双字还是其他大小进行比较。
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
运行结果
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
标签:汇编,Arr,--,mov,二进制,si,bx,子程序
From: https://www.cnblogs.com/lmj00/p/17863463.html