汇编:循环结构

embedded/2024/10/20 5:22:41/

16位汇编语言中的循环结构主要通过条件跳转指令(如LOOPJMP, JE, JNE, JG, JL, 等)来实现,常见的循环类型包括for循环和while循环;

Loop指令

LOOP指令的操作非常简单:它将CX寄存器的值减1,如果结果不为零,则跳转到指定的标签。这使得它特别适用于已知循环次数的情况,比如for循环。

LOOP target

target 是一个标签,指向循环的开始位置。

示例:打印9~1值
assume cs:code
​
code segment
start:mov cl,9    
​
;循环体
loop_test:mov al,cladd al,30h ;将值转化为ASCII字符mov dl,al  ;输出的内容转入dl寄存器中mov ah,02h ;调用21号中断的02功能号进行内容输出int 21hloop loop_test
​mov ah,07hint 21hmov ax,4c00hint 21h 
​
code ends
end start

mov cl,9将寄存器 CL 设置为 9,表示将从9开始循环。

循环体:

  mov al,cl:将 CL 的值复制到 AL 寄存器。

  add al,30h:将 AL 的值加上 30h。在ASCII码表中,数字字符'0'的值是0x30,所以加上0x30可以将0-9的数字转换为'0'-'9'的ASCII字符。

  mov dl,al:将 AL 的值复制到 DL 寄存器。DOS中断21h的功能号02h要求输出的字符存储在 DL 中。

  mov ah,02h:设置 AH 为 02h,准备调用DOS中断21h的功能号02h,进行字符输出。

  int 21h:调用DOS中断21h,输出字符。

  loop loop_test:将 CL 减1,如果 CL 不为零,则跳转到 loop_test 继续循环。

执行结果:

JCC指令构造循环

条件跳转:在16位汇编语言中,可以使用条件跳转指令(JCC指令)来构造循环结构。JCC指令(Jump if Condition is met)包括一系列条件跳转指令,如 JE(等于跳转), JNE(不等于跳转), JG(大于跳转), JL, JGE(大于等于跳转), JLE(小于等于跳转) 等,用于根据条件进行跳转。

示例:打印1-9
assume cs:code
​
code segment
start:mov bx,1
​
loop_test:     ;循环标签mov al,bladd al,30hmov dl,almov ah,02hint 21hinc bxcmp bx,10jl loop_test  ;跳转到循环标签
​mov ah,07hint 21hmov ax,4c00hint 21h 
​
code ends
end start
代码含义:

  mov bx,1:初始化寄存器BX为1。BX寄存器将作为循环计数器,并用于生成要打印的数字。

  mov al,bl:将BLBX的低字节)的值复制到AL寄存器。

  add al,30h:将AL寄存器的值加上30h(48的十六进制值),这是为了将数字转换为对应的ASCII码。例如,数字1的ASCII码是49(31h),等于1 + 48。

  mov dl,al :将转换后的ASCII码从AL寄存器复制到DL寄存器。

  mov ah,02h :将AH寄存器设置为02h,这是DOS的打印字符功能。

  int 21h:通过int 21h中断调用DOS服务来打印DL寄存器中的字符。

  inc bx指令将BX寄存器的值加1。

  cmp bx,10指令将BX的值与10进行比较。

  jl loop_test如果BX小于10,jl loop_test指令会跳转回loop_test标签,继续循环。

最后运行结果:


http://www.ppmy.cn/embedded/43488.html

相关文章

Swift 类和结构体

类和结构体 一、结构体和类对比1、类型定义的语法2、结构体和类的实例3、属性访问4、结构体类型的成员逐一构造器 二、结构体和枚举是值类型三、类是引用类型1、恒等运算符2、指针 结构体和类作为一种通用而又灵活的结构,成为了人们构建代码的基础。你可以使用定义常…

go语言基准测试Benchmark 最佳实践-冒泡排序和快速排序算法基准测试时间复杂度对比

在go语言中Benchmark基准测试( 在后缀为_test.go的文件中,函数原型为 func BenchmarkXxx(b *testing.B) {}的函数 )可以用来帮助我们发现代码的性能和瓶颈, 其最佳实践 应该是我们最常用的 冒泡排序和快速排序的测试了,废话不说,直…

【HarmonyOS】View点击穿透,层叠View点击事件控制

【HarmonyOS】View点击穿透,层叠View点击事件控制 问题背景: 在HarmonyOS中,经常会有层叠的View的布局,当碰到需要穿透的布局需求。就需要能控制View对点击事件的处理。 方案一,使用touchable: 目前虽然函…

用大模型搭建一个自己的新闻小助手

背景 信息快速增长的时代,及时获取到有价值的资讯是一件很必要的事情。已经有各类新闻app和获取信息的渠道了,为什么还需要在构建一个小助手来获取新闻资讯呢?其实原因很简单各类新闻app服务的是具体一类人群,个人和人群还是有偏…

某勾求职网逆向分析

搜索目标: aHR0cHM6Ly93d3cubGFnb3UuY29tL3duL2pvYnM/cG49MSZweD1kZWZhdWx0JmZyb21TZWFyY2g9dHJ1ZSZrZD0lRTYlOTUlQjAlRTYlOEQlQUUlRTUlODglODYlRTYlOUUlOTA= 抓包分析 请求和返回都是加密的 请求头部也有未知参数 跟栈分析 请求和返回是一个AES加密,加密的KEY是session s…

三前奏:获取/ 读取/ 评估数据【数据分析】

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …

列表元素添加的艺术:从单一到批量

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、向列表中添加单一元素 1. append方法 2. insert方法 三、向列表中添加批量…

React hooks - useRef

useRef 用法特点注意事项 用法 useRef 函数返回一个可变的 ref 对象,该对象只有一个 current 属性。可以在调用 useRef 函数时为其指定初始值。并且这个返回的 ref 对象在组件的整个生命周期内保持不变。 // 1. 导入 useRef import { useRef } from react // 2. 调…