汇编——分支

昨儿刚考完汇编,觉得有些差强人意,这些东西不知道以后用不用得到,反正先写写,纸质的资料像我这种神经大条应该保存不了太久。第一次尝试,以后应该会持续更新。
汇编的这些程序我都是在DOXBOX中运行的,其他的运行软件暂时还没接触过哈哈。

分支问题:
FZ1:有三个字数据X,Y,Z,若X>Y,则求X+Y-Z,结果放在字W中,否则在W中放2X-Y+Z的结果(和我们期末考试第一道编程题类似)

Data   segment
x dw 3      
y dw 2
z dw 4
w dw ?
data ends
stack segment para stack
dw 10 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:  mov ax,data
         mov ds,ax
         mov ax,x
         cmp ax,z              //ax里的内容和z比较,也就是x和z比较
         ja a1                     //ja(A>B) 也就是说x>z的时候跳转到a1,否则就顺序执行       
         shl ax,1                //移位操作,相当于X乘以2
         sub ax,y
         add ax,z
         JMP  over
  a1:    mov  ax,x
         add ax,y
         sub ax,z
         jmp over
 over:   mov w,ax  
        mov ah,4ch
        int 21h
     Code  ends
     End  start

最后程序运行出来的结果正确
在这里插入图片描述

FZ2:有一个个字节变量a和一个字变量X,若a中为偶数,则把X中低字节清0,高字节不变;若a为奇数,则把x中高字节清0,低字节不变。
解题思路
奇数偶数的比较可以用test(测试指令,对两个操作数进行逻辑与运算,结果不送回目的操作数)比较,字变量x放16位寄存器中,以ax为例,高字节则是ah,低字节则是al。

Data segment
a db 4h
x dw 1523h
data ends
stack segment
dw 10 dup(0)
stack ends
code segment
assume cs:code,ss:stack,ds:data
start:mov ax,data
      mov  ds,ax
      mov  al,a
      mov  bx,x
      test  al,01h          //判断奇偶(最后一位是0则是偶数,是1则是奇数)
      jz a1                 //jz(等于零就跳转到a1)
      mov bh,0              //高字节清零
      mov x,bx
     jmp over
a1:mov bl,0            //低字节清零
   mov x,bx
over: mov ah,4ch
    int 21h
 code  ends
 end start

BX变成1500,低字节已清零
俩题思路差不多,转移指令用好就OK。

### 关于汇编语言分支程序设计 #### 基本概念 汇编语言中的分支程序设计主要用于根据条件判断执行不同的代码路径。这种技术广泛应用于各种场景,比如多路选择逻辑、错误处理以及复杂算法实现等[^1]。 #### 多分支程序设计方法 为了简化复杂的多分支结构,可以利用跳转表来实现高效的多分支程序设计。通过预先定义一个包含各分支目标地址的表格(称为跳转表),可以根据输入参数快速定位到对应的分支位置并执行相应代码[^2]。以下是基于此理念的一个具体实例: ```assembly DATA SEGMENT TABLE DW CASE0, CASE1, CASE2, CASE3 ; 定义跳转表 NUM DB ? ; 输入数据变量 DATA ENDS CODE SEGMENT START PROC FAR ASSUME CS:CODE, DS:DATA MOV AX, DATA ; 初始化数据段寄存器 MOV DS, AX LEA BX, TABLE ; 获取跳转表基址 MOV AL, NUM ; 将输入值加载到AL中 AND AL, 0FH ; 确保数值有效范围(如果必要的话) SHL AL, 1 ; 计算偏移量 (乘以2因为每个地址占用2字节) XBX BX ; 更新BX指向对应条目 JMP WORD PTR[BX] ; 执行间接跳跃指令到达指定案例处 CASE0 LABEL NEAR ... ; 实现第一个分支功能 JMP EXIT ; 结束当前分支返回主流程 CASE1 LABEL NEAR ... JMP EXIT CASE2 LABEL NEAR ... JMP EXIT CASE3 LABEL NEAR ... EXIT: RET ; 返回调用者环境结束整个过程 START ENDP CODE ENDS END START ; 指定入口点声明文件终止符 ``` 以上代码片段展示了如何构建一个多分支程序框架,其中`TABLE`数组保存了不同情况下的起始标签地址;当运行时依据用户提供的索引值动态决定进入哪一个子例程部分继续往下走。 #### 条件转移语句修正示例 在某些情况下可能遇到不符合规则的情况需要调整原方案使其合法化。例如存在双存储器间直接传送命令违反规定的情形下需改写成先经过暂存区再做进一步操作的形式如下所示[^3]: ```assembly MOV AX,n ; 加载源值N至AX寄存器 MOV array_head[si-2],0FFFFH ; 设置头部特殊标志位 MOV SI,0 ; 清零SI准备迭代访问列表项 COMPARE: CMP ARRAY_END[SI],AX ; 对比当前位置元素大小关系 JLE INSERT ; 如果小于等于则插入新成员前停止循环 MOV BX,ARRAY_END[SI] ; 否则读取旧值出来临时存放起来 MOV ARRAY_END[SI+2],BX ; 并将其向后移动腾出空间给新的更大值进来 SUB SI,2 ; 减少计数器以便下次比较下一个更前面的位置上的数字 JMP COMPARE ; 继续重复直至找到合适地点为止 INSERT: MOV ARRAY_END[SI+2],AX ; 插入最终确定下来的新成员至此空隙之中完成排序动作序列 ``` 这段修改后的版本解决了原始设计方案中存在的违规现象并通过合理安排中间过渡环节实现了预期目的同时保持语法正确性[^3]。 #### 应用举例——奇偶分类处理 考虑这样一个需求:对于两个已知无符号整型数值num1和num2,按照它们各自的特性分别采取适当措施加以处置并将结果记录下来供后续分析使用。下面是针对该问题给出的一套解决方案说明及其配套实施细节描述[^4]: ```assembly ; 数据段初始化省略... PROCEDURE PROCESS_NUMBERS ASSUME CS:CODE_SEG, DS:DATA_SEG MOV AH, BYTE PTR[NUM1] ; 取得第一个待测数放入AH寄存器高位半部等待检测其属性特征... AND AH, 01H ; 测试最低有效位状态得知是否属于奇类还是偶类别成员之一种情形而已啦~ JE EVEN_CHECK_1 ; 若判定为后者就转向专门负责此类事务的具体业务逻辑模块去执行相关任务咯~ ODD_ACTION_1: MOV DL,BYTE PTR[NUM1] ; 把这个确认下来的奇异数复制一份留作纪念吧:) MOV DA1,Dl ; 存储进预定好的DA1单元格里头作为标记用途哈~ ... ; 进一步扩展其他必要的额外附加步骤内容此处略过不提哦! EVEN_CHECK_1: TEST BYTE PTR[NUM2], 01H ; 类似地再次审查第二个候选对象看看它到底站在哪一边阵营呢? JNZ ODD_ACTION_2 ; 发现有异动立即切换方向前往另一侧战场应战喽! BOTH_EVEN_ACTIONS: INC BYTE PTR[DA1] ; 当发现双方均为同道中人之时不妨各自加冕一顶皇冠表示庆祝一番嘛! INC BYTE PTR[DA2] ... ; 更多精彩剧情发展请期待下一回分解哟!!! ODD_ACTION_2: MOV DH,BYTE PTR[NUM2] MOV DA2,DH ... RET ; 最终收工回家休息睡觉养精蓄锐迎接明天更大的挑战呀少年们加油干吧!!! PROCESS_NUMBERS ENDP ``` 上述例子清晰地演示了一个典型的应用场景当中是如何巧妙运用分支机制达成特定目标效果的过程展示图解教程指南手册大全集锦合辑精选版[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值