首页 > 编程语言 >汇编--简单的子程序调用

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

时间:2023-11-28 23:45:53浏览次数:32  
标签:汇编 Arr -- mov 二进制 si bx 子程序

目录

前言

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



程序要求

使用两个子程序,定义一个变量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


二进制转十六进制子程序

  • 注意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

运行结果

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

标签:汇编,Arr,--,mov,二进制,si,bx,子程序
From: https://www.cnblogs.com/lmj00/p/17863463.html

相关文章

  • 关于Python类型注解的几个实用小技巧
    虽然python是动态类型语言,但是python3.5引入的类型注解特性却很有用.不但有助于源码阅读,而且在类型提示和代码自动补全上也很方便.但是它毕竟不是静态类型编译型语言,有一些特殊的情况,需要一些小技巧才能够处理.引用后面定义的类型由于python不是编译型语言,如果在前......
  • Linux--文件查找、打包压缩以解压
    文件查找1.echo命令查看PATH变量的值: 2.which命令在环境变量PATH设置的目录中查找符合条件的命令条件:参数:n<文件名长度>指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。p<文件名长度>与-n参数相同,但此处的<文件名长度>包括了文件的路径。w指定......
  • fastadmin部署出现后台登录404,前台正常
    部署fastadmin程序的时候后台登录界面404,前台正确http://127.0.0.1/hCLOyNErFa.php自动跳转到http://127.0.0.1/hCLOyNErFa.php/index/login原因:伪静态的问题fastadmin默认部署推荐的是thinkphp伪静态location~*(runtime|application)/{return403;}location/{......
  • SystemSettingsBroker.exe这个奇怪的进程
    系统版本:22621.2715做完PBRReset之后,进入系统,CheckSystemSettingsBroker.exe并没有存在,点击网络图标(TaskBar)后,SystemSettingsBroker.exe进程被拉起了。然后重启系统。 重启系统之后,放置一段时间,系统进入熄屏状态,通过键盘唤醒系统,进入S0,这时发现SystemSettingsBroker.exe又......
  • linux安装opencv
    安装步骤:1、去官方网站下载使用的压缩包: https://opencv.org/releases.html2、上传到服务器并解压文件cd/usr/local/unzipopencv-2.4.13.zip3、创建编译目录,用于存放编译文件在/usr/local/下mkdiropencv4、安装和配置依赖支持如果没有cmake,去cmake的官网http://cmake......
  • Oracle数据库性能
    Oracle数据库性能数据库性能两大指标QPS(QueriesPerSecond,每秒查询数)TPS(TransactionsPerSecond,每秒处理事务数)具体案例QPS--一分钟QPSselectvaluefromv$sysmetricwheremetric_namein('ExecutionsPerSec')andgroup_id=2--15秒QPSselectvaluefrom......
  • Mac杀掉自启动的app
     ls-l路径/app_name查看软件在不同用户对象时所拥有的权限,想恢复时保持修改前后一致即可路径查看:右击程序,在访达中显示去掉所有对象的执行权限:sudochmoda-x路径/app_name或 sudochmod-x路径/app_name当想恢复时:sudochmoda+x 路径/a......
  • Educational Codeforces Round 158 (Rated for Div. 2)
    A.LineTripThereisaroad,whichcanberepresentedasanumberline.Youarelocatedinthepoint\(0\)ofthenumberline,andyouwanttotravelfromthepoint\(0\)tothepoint\(x\),andbacktothepoint\(0\).Youtravelbycar,whichs......
  • Vector
    在Java中,Vector是一个非常重要的数据结构,它是一个动态数组,可以在运行时动态地增加或减少元素。Vector的基本操作   添加元素:使用add()方法可以将元素添加到Vector的末尾。此外,add(index,element)方法可以在指定的索引处添加元素。Vector<Integer>vector=newVector<Inte......
  • Linux学习记录:yum管理器
    1.yum是CentOS和RedHat中的Shell前端软件包管理器。2.yum基础源官方源:更新yum仓库本地缓存 3.yum的使用首先要确认网络是否联通,在这里我们可以ping一下外网来测试 然后查看软件包 最左边的是各种操作系统下的软件名称,中间是发行版本,最右边的是发行商。 安装软件......