题目:设X和Y均为16位无符号数,写一个求表达式16X+Y的值
加法实现:
代码如下:
DATAS SEGMENT ;此处输入数据段代码 XXX DW 1234H ;设X为1234H YYY DW 5678H ;设Y为5678H ZZZ DD ? ;用Z来保存最后运算的结果 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AX,XXX ;讲X送至AX,作为三十二位结果的低十六位储存 XOR DX,DX ADD AX,AX ;X*2 AX是低十六位,无需接收进位用ADD ADC DX,DX ;DX 是高十六位,需要接收进位,用ADC ADD AX,AX ;X*4 ADC DX,DX ADD AX,AX ;X*8 ADC DX,DX ADD AX,AX ;X*16 ADC DX,DX ADD AX,YYY ;X+Y; ADC DX,DX MOV WORD PTR ZZZ,AX ;将低16位AX中的数据,复制传送到变量Z所指向的两个字节16位存储单元中。 ;因为ZZZ定义的是双字,所以不能直接MOV ZZZ,AX 而是使用WORD PTR 将ZZZ变量地址当作字变量来使用 MOV WORD PTR ZZZ+2,DX ;;将高16位DX中的数据传送到相应位置,因为前面低十六位占两个内存单元,所以这里从两个内存单元之后进行储存 MOV AH,4CH INT 21H CODES ENDS END START
乘法实现:
DATAS SEGMENT ;此处输入数据段代码 XXX DW 1234H ;设X为1234H YYY DW 5678H ;设Y为5678H ZZZ DD ? ;用Z来保存最后运算的结果 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AX,XXX ;讲X送至AX,作为三十二位结果的低十六位储存 MOV DX,16 MUL DX ;MUL 汇编语言无符号数乘法指令 ;格式:MUL SRC 执行的操作: ;字节操作数:(AX)←(AL)*(SRC) ;字操作数:(DX,AX)←(AX)*(SRC) ADD AX,YYY ;X+Y; ADC DX,DX MOV WORD PTR ZZZ,AX ;将低16位AX中的数据,复制传送到变量Z所指向的两个字节16位存储单元中。 ;因为ZZZ定义的是双字,所以不能直接MOV ZZZ,AX 而是使用WORD PTR 将ZZZ变量地址当作字变量来使用 MOV WORD PTR ZZZ+2,DX ;;将高16位DX中的数据传送到相应位置,因为前面低十六位占两个内存单元,所以这里从两个内存单元之后进行储存 MOV AH,4CH INT 21H CODES ENDS END START