本来简单的两个数相加用高级语言只是两行代码的问题,但是到了汇编语言,就需要什么考虑了,比如先定义数据段 还有代码段,有的时候还需要定义堆栈段
eg:先定义数据段:
DATAS SEGMENT
data1 DB 255 dup('$') ;定义了一个变量名为data1 长度为255个字 的字符串
data2 DB 255 dup('$') ; 同上
str1 DB 'please input first number: $ ' ;定义字 准备要输出的字符串先定义好
str2 DB 'please input second number: $ ' ;同上
str3 DB 255 dup('$')
kong DB 0DH,0Ah ,'$'
DATAS ENDS
定义堆栈
STACK SEGMENT
stac DB 255 dup(?) ;定义了一个名为stac的堆栈
STACK ENDS
在每个定义的段之后还要加
ASSUME DS:DATAS,CS:CODES
这样说明只是定义了 数据段 和代码段
这样还要有字符串的简单输入和输出
DATA SEGMENT
str1 db 255 dup('$')
str2 db 0DH,0Ah,'$' ; 0AH是换行
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,str1
MOV AH,0AH
INT 21H
LEA DX,str2
MOV AH,09H
INT 21H
LEA DX,[str1+2]
;ADD DL,48
;ADD DL,30H
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
下面就是整个两位数相加的代码
DATAS SEGMENT
data1 DB 255 dup('$') ;定义了一个变量名为data1 长度为255个字 的字符串
data2 DB 255 dup('$') ; 同上
str1 DB 'please input first number: $ ' ;定义字 准备要输出的字符串先定义好
str2 DB 'please input second number: $ ' ;同上
str3 DB 255 dup('$')
kong DB 0DH,0Ah ,'$'
DATAS ENDS
STACK SEGMENT
stac DB 255 dup(?) ;定义了一个名为stac的堆栈
STACK ENDS
CODES SEGMENT
ASSUME DS:DATAS,CS:CODES
START:
MOV AX, DATAS
MOV DS, AX
LEA DX,str1
MOV AH,09H
INT 21H
;输入第一个两位数
LEA DX,data1
MOV AH,0AH
INT 21H
;输换行
LEA DX,kong
MOV AH,09H
INT 21H
;保存data1的个位和十位
MOV BL, [data1+2];十位
SUB BL,'0'
MOV BH, [data1+3];个位
SUB BH,'0'
LEA DX,str1
MOV AH,09H
INT 21H
;输入第二个两位数
LEA DX,data2
MOV AH,0AH
INT 21H
;输换行
LEA DX,kong
MOV AH,09H
INT 21H
;保存两位数的个位和十位
MOV CL,[data2+2]
SUB CL,'0'
MOV CH,[data2+3]
SUB CH,'0'
;开始相加
ADD BL,CL
ADD BH,CH
CMP BH,10
JGE single_adding
tens_adding:
CMP BL,10
JGE input_num
JMP input_num2
single_adding:
SUB BH,10
ADD BL,1
JMP tens_adding
input_num:
SUB BL,10
MOV DL,1
ADD DL,30H
MOV AH,02H
INT 21H
JGE input_num2
input_num2:
MOV DL,BL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BH
ADD DL,30H
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START