本来两个数相加,用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 跳转SS3
SS1: 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 21H
CODES ENDS
END START START结束
注释是在中文前面加分号。没想到,一个进位,也要判断,一个的输出也是那么的麻烦,不过,原理性的东西就在这里,语言原来让编程美好了许多。不然你写个加法都这样,让你做个计算器出来还了得。