当前位置:文档之家› 汇编带进位加法

汇编带进位加法

一.实验题目:8位,16位,32位加法运算(考虑进位)
二.程序内容及结果
1.8位加法运算
#include<stdio.h>
#include<math.h>
int main()
{
char buffer[5]={110,132,123,234,112};
int sum;
_asm
{
LEA ESI,buffer
MOV CX,5//计数器
XOR EAX,EAX//清0
NEXT:
ADD AL,[ESI]//低8位相加
ADC AH,0//高8位加上可能的进位
INC ESI//指针指向下一位
DEC CX//计数器减1
JNZ NEXT//计数器不为0,跳转
MOV sum,EAX
}
printf("8位加法\n")
printf("sum=%d\n",sum);
return 0;
}
2.16位加法运算
1)移位,不考虑进位
#include<stdio.h>
#include<math.h>
int main()
{
int BUFFER[5]={110,132,123,234,112};//五个32位整形数
int SUM;
_asm
{
LEA ESI,BUFFER//取数组的首地址
XOR ECX,ECX//清0
MOV DX,5//计数器,5次
NEXT:
MOV EAX,[ESI]//赋值
MOV EBX,EAX
AND EAX,0000FFFFH//32位前16位变为0,后16位不变
SHR EBX,16//右移16位
ADD AX,BX//低16位相加
ADD CX,AX//结果放在cx中
ADD ESI,4//指针指向下一位整数
DEC DX
JNZ NEXT
MOV SUM,ECX
}
printf("16位加法移位程序,不考虑进位\n");
printf("SUM=%x\n",SUM);
printf("SUM=%d\n",SUM);
return 0;
}
2)16位考虑进位
#include<stdio.h>
#include<math.h>
int main()
{
int BUFFER[5]={110,132,123,234,112};//整形32位
int SUM;
_asm
{
LEA ESI,BUFFER//取数组的首地址
MOV DX,10//计数器,32位分解成16加法,10个
XOR BX,BX//EBX清零
NEXT:
MOV AX,[ESI]//首地址后的16位赋值给AX
ADD BX,AX//16加法
ADC CX,0//进位放在CX中
ADD ESI,2//指针指向下一个16位
DEC DX//计数器减1
JNZ NEXT//计数器不是0跳转
LEA ESI,SUM//取SUM的低位地址
MOV [ESI],BX//加法的低16位放在SUM首地址的低32位
MOV [ESI+2],CX//进位放在SUN的高32位
}
printf("16位加法考虑进位");
printf("SUM=%d\n",SUM);
return 0;
}
3.32位加法
#include<stdio.h>
#include<math.h>
int main()
{
long long int BUFFER[5]={110,132,123,234,112};//长整形64位 long long int SUM;
_asm
{
LEA ESI,BUFFER//取数组的首地址
MOV EDX,10//计数器,64位分解成32加法,10个
XOR EBX,EBX//EBX清零
NEXT:
MOV EAX,[ESI]//首地址后的32位赋值给EAX
ADD EBX,EAX//32加法
ADC ECX,0//进位放在ECX中
ADD ESI,4//指针指向下一个32位
DEC EDX//计数器减1
JNZ NEXT//计数器不是0跳转
LEA ESI,SUM//取SUM的低位地址
MOV [ESI],EBX//加法的低32位放在SUM首地址的低32位
MOV [ESI+4],ECX//进位放在SUN的高32位
}
printf("32位加法\n");
printf("SUM=%I64d\n",SUM);
return 0;
}。

相关主题