设有两个16位整数变量A和B,试编写完成下述操作的程序。
(1)若有两个数中一个是奇数,则将奇数存入A中,偶数存入B中。
(2)若两个数均为奇数,则两数分别减1,并存回原变量中。
(3)若两数均为偶数,则两变量不变。
即只需要分成两大类判断即可,①A、B一奇一偶 ②A、B都是奇数或同是偶数;然后,同奇或同偶再进行细分,是同奇还是同偶
汇编思路:首先DATA段定义A、B变量。其次,A赋值给AX,B赋值给BX,使用AX、BX进行参与运算。AX和BX进行异或运算,结果存放到AX中,然后与0001H进行TEXT与运算,判断AX的最后结果,结果为1,则A、B一奇一偶,否则为A、B同奇或同偶。一奇一偶,XCHG交换两数;若同偶,调用4CH结束即可;若同奇,分别减一DEC,然后输出即可。
代码如下:
DATA SEGMENT
A DW ?
B DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LOP: MOV AX,A ;将变量A赋值给通用寄存器AX
MOV BX,B ;将变量B赋值给通用寄存器BX
XOR AX,BX ;异或运算是为了判断A、B是否为一奇一偶、同奇或同偶,若AX最后一位为1,则一奇一偶,否则A、B同奇或同偶
TEXT AX,0001H;与运算,只需要判断最后一位是否为1,结果为1,则A、B一奇一偶,否则为A、B同奇或同偶
JZ NEXT ;若最后AX结果为0,即A、B同奇或同偶,跳转NEXT标签处 否则,A、B一奇一偶,执行下条指令
TEXT BX,0001H;执行到此条指令,此时A、B一奇一偶已确定,只需要奇数存入A,偶数存入B即可 由于XOR AX,BX此时的AX已经不再存放原来A中内容,但是BX仍存放B的内容,需要判断BX是否为奇数 执行此命令与运算操作,结果若为0,表示BX为偶数,则A为奇数 反之结果为1,BX为奇数,A为偶数
JZ EXIT ;若BX为0,即AX为奇数,BX为偶数,跳转EXIT标签处 否则执行下条指令
XCHG BX,A ;执行到此条指令前,此时AX为偶数,BX为奇数,即A存放偶数,B存放奇数,交换A和BX的数据,即A存放BX的奇数,BX存放A的偶数
MOV B,BX ;将BX存放A的偶数赋值给B,最终,A存放奇数,B存放偶数
JMP EXIT ;无条件跳转到EXIT标签处
NEXT: TEXT BX,0001H;执行到此条指令前,已确定A、B同奇或同偶,由于XOR AX,BX此时的AX已经不再存放原来A中内容,但是BX仍存放B的内容,需要判断BX是否为奇数 执行此命令与运算操作,结果若为0,表示BX为偶数,则A也为偶数,即同偶,否则同奇
JZ EXIT ;若BX为0,即同偶,跳转EXIT标签处 否则执行下条指令
DEC B ;执行到此条指令前,此时A、B同奇,由题目要求需要两数分别减一,并存回原变量中 B减一
DEC A ;A减一
EXIT: MOV AH,4CH ;执行到此条指令前,表示AX为奇数,BX为偶数,即A存放奇数,B存放偶数,由题目要求可得,直接输出即可,调用4CH号功能,返回DOS操作系统指令
INT 21H ;终止当前程序的运行,并返回DOS系统
CODE ENDS
END START