大家好啊,我是xin麒,公众号是善于思考的编程麒,今天又来分享一道汇编题目:
问题描述:
已定义了两个整数变量A和B,试编写程序完成下列功能:
(1) 若两个数中有一个是奇数,则将奇数存入A中,偶数存
入B中;
(2) 若两个数均为奇数,则将两数均加1后存回原变量。
题解(asm代码):
注释如有错误望指正哈
;5.2 已定义了两个整数变量A和B,试编写程序完成下列功能:
; (1) 若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中;
; (2) 若两个数均为奇数,则将两数均加1后存回原变量。
;--------------思路分析--------------》
;先明确情况:①奇偶②偶奇③偶偶④奇奇
;分析思路:
;两个相加,如果值为奇数,则必定有一个为奇数,另一个为偶数
; 如果为偶数,则1、两个均为奇数
; 2、两个为偶数--->不做任何处理
;设计程序:CLC将CF请0,将和加到AX中,带进位右移1位,
;如果为偶数,先将a mov到 ax,判断是奇数还是偶数,如果是奇数,那么实现分别两者加1
;如果是偶数,跳到结束战斗
;如果和为奇数,
; 则将A mov到ax里面判断是否为奇数,如果是,那么跳到结束战斗
; 如果为偶数,则将A值传到ax,将b值赋给a值,ax值mov到a,跳到结束战斗
;《-------------------------------------
DATA SEGMENT
;<-----①------>
;NUMBER1 DB 43
;NUMBER2 DB 62
;<-----②------>
;NUMBER1 DB 42
;NUMBER2 DB 63
;<-----③------>
NUMBER1 DB 42
NUMBER2 DB 62
;<-----④------>
;NUMBER1 DB 4
;NUMBER2 DB 63
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA ;ASSUME伪指令,说明段与段寄存器之间的对应关系
MOV DS,AX
MOV AL,NUMBER1
ADD AL,NUMBER2
CLC
RCR AL,1
JAE IS_EVEN;如果CF=0说明和为偶数,直接跳进IS_EVEN
;为奇数,那么就往下走:
MOV AL,NUMBER1
CLC
RCR AL,1
JC FINNAL;jc:如果CF=1那么跳转<----①奇偶-------->
;如果CF=0,说明为偶数,则交换NUMBER1 和 NUMBER2:-------②偶奇---------->
MOV AL,NUMBER2
MOV BL,NUMBER2
MOV NUMBER1,BL;不可以使用XCHG NUMBER2,NUMBER1,否则会报operand combination illegal的双操作数指令中两个操作数组合出错。
MOV NUMBER2,AL
CLC
JAE FINNAL
;<-----------------
;-----------------③偶偶----------------->
IS_EVEN:
MOV AL,NUMBER1
CLC
RCR AL,1
JAE FINNAL;如果都是偶数,直接结束,如果都是奇数那么往下走
;----------------④奇奇--------------->
;第一个数加1
MOV AL,NUMBER1
ADD AL,1
MOV NUMBER1,AL
;第二个数加1
MOV AL,NUMBER1
ADD AL,1
MOV NUMBER1,AL
;<----------------------------------
;<-------------------------------------------
FINNAL: MOV AH,4CH ;结束战斗
INT 21H
CODE ENDS
END START
原创不易,如果觉得有帮助的话麻烦点个赞呗