本来两个数相加,用c语言写的话。
#include<stdio.h>
int main(){
int i =8,j = 9;
printf("%d",i+j);
}
到了汇编,第一次写的时候,连个最简单的都想了半天。
DATAS SEGMENT 定义数据段标识为“DATAS” OP1 DB 09H定义op1 为 byte类型 值为09H OP2 DB 08H 定义op2 为 byte类型 值为08H DEFULT DB ? 定义DEFULT 为 byte类型 值为待定 CARRY DB ? 定义CARRY 为 byte类型 值为待定DATAS ENDS数据段结束STACKS SEGMENT 堆栈段开始STACKS ENDS 堆栈段结束CODES SEGMENT定义代码段标识为“CODES” ASSUME CS:CODES,DS:DATAS,SS:STACKS 设置数据段和代码段的默认寄存器START: 起始标志 MOV AX,DATAS MOV DS,AX将DATAS赋值给DS MOV AL,OP1将OP1赋值给AL ADD AL,OP2 AAA 非压缩BCD码加法调整 JC SS2如果进位 跳转到SS2 JMP SS3跳转SS3 JNC SS1不进位 跳转SS2 JMP SS3 跳转SS3SS1: MOV CARRY,30H 条件要求,给CARRY加上30H SS2: MOV CARRY,31H条件要求,给CARRY加上31H SS3:MOV DEFULT,AL ADD DEFULT,30H; MOV DL,CARRY 将CARRY赋值给DL MOV AH,2 INT 21H 在控制台上输出字符串 MOV DL,DEFULT将DEFAULT赋值给DL MOV AH,2 INT 21H在控制台上输出字符串 MOV AH,4CH正常结束程序 INT 21HCODES ENDSEND STARTSTART结束
注释是在中文前面加分号。没想到,一个进位,也要判断,一个的输出也是那么的麻烦,不过,原理性的东西就在这里,语言原来让编程美好了许多。不然你写个加法都这样,让你做个计算器出来还了得。