第一次写汇编,两天从一脸蒙蔽到硬着头皮写程序,我做到了,写出来的时候激动得说不出话
函数:当|x|<=3时y=3*x-5,当|x|>3,y=6
DATA SEGMENT
PROMRT DB "Input X (-10000~+10000):$"
BUFFER DB 6, ?, 6 DUP("$")
C10 DW 10
X DW ?
OUT_MSG DB 0DH,0AH,"Y=$"
DATA ENDS
PROMRT DB "Input X (-10000~+10000):$"
BUFFER DB 6, ?, 6 DUP("$")
C10 DW 10
X DW ?
OUT_MSG DB 0DH,0AH,"Y=$"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,PROMRT ;输出提示符
MOV AH,9
INT 21H
LEA DX,BUFFER ;输入字符串
MOV AH,0AH
INT 21H
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,PROMRT ;输出提示符
MOV AH,9
INT 21H
LEA DX,BUFFER ;输入字符串
MOV AH,0AH
INT 21H
LEA BX,BUFFER+2 ;判断第一个字符是否是负号
MOV DL,[BX]
CMP DL,'-' ;判断并跳入
JE FU
MOV DL,[BX]
CMP DL,'-' ;判断并跳入
JE FU
ZHENG: ;正数输入
MOV CL,BUFFER+1 ;将第一个字符,数字字符的个数作为循环次数
MOV CH,0 ;循环次数高八位清0
LEA BX,BUFFER+2 ;装载输入字符首地址
MOV AX,0 ;累加器清0
JMP ONE ;跳入正数的第一个步骤
MOV CL,BUFFER+1 ;将第一个字符,数字字符的个数作为循环次数
MOV CH,0 ;循环次数高八位清0
LEA BX,BUFFER+2 ;装载输入字符首地址
MOV AX,0 ;累加器清0
JMP ONE ;跳入正数的第一个步骤
FU: ;负数输入
MOV CL,BUFFER+1 ;将第一个字符,数字字符的个数作为循环次数
SUB CX,01H ;将数组字符个数减一,去除负号的个数
MOV CH,0 ;循环次数高八位清0
LEA BX,BUFFER+2 ;装载输入字符首地址,带符号
MOV AX,0 ;累加器清0
INC BX ;指针BX+1,跳过负数
MOV CL,BUFFER+1 ;将第一个字符,数字字符的个数作为循环次数
SUB CX,01H ;将数组字符个数减一,去除负号的个数
MOV CH,0 ;循环次数高八位清0
LEA BX,BUFFER+2 ;装载输入字符首地址,带符号
MOV AX,0 ;累加器清0
INC BX ;指针BX+1,跳过负数
ONEF: ;负数字符转化为数字
MUL C10 ;P=P*10
MOV DL,[BX] ;取第一个字符
SUB DX,30H ;转化为数字
ADD AX,DX ;数字赋予AX
INC BX ;指针往后加一
LOOP ONEF ;循环
MUL C10 ;P=P*10
MOV DL,[BX] ;取第一个字符
SUB DX,30H ;转化为数字
ADD AX,DX ;数字赋予AX
INC BX ;指针往后加一
LOOP ONEF ;循环
MOV X,AX ;赋值给X
COMPF: ;负数判断
CMP X,3
JG L ;对于小于-3,同大于3
CMP X,1 ;对一特殊处理
JE LFU1
JMP LFU ;对-1和-3的处理
COMPF: ;负数判断
CMP X,3
JG L ;对于小于-3,同大于3
CMP X,1 ;对一特殊处理
JE LFU1
JMP LFU ;对-1和-3的处理
ONE: ;字符转化为数字
MUL C10 ;P=P*10
MOV DL,[BX] ;取第一个字符
SUB DX,30H ;转化为数字
ADD AX,DX ;数字赋予AX
INC BX ;指针往后加一
LOOP ONE ;循环
MUL C10 ;P=P*10
MOV DL,[BX] ;取第一个字符
SUB DX,30H ;转化为数字
ADD AX,DX ;数字赋予AX
INC BX ;指针往后加一
LOOP ONE ;循环
MOV X,AX ;赋值给X
COMP:CMP X,3 ;正数判断
JG L
CMP X,1 ;对1特殊处理
JE L11
CMP X,0 ;对0特殊处理
JE L0
L1: ;小于3且不等于0,1顺序执行
MOV BX,X ;BX=X
MOV AX,X ;AX=X
ADD AX,BX ;AX=AX+X=2*X
ADD AX,BX ;AX=AX+BX=3*X
SUB AX,5 ;AX=AX*3-5
JMP OUTPUT0 ;输出,第一类
L: ;赋值答案
MOV AX,6
JMP OUTPUT0
L11: ;X=1输出
MOV AX,2
JMP OUTPUT2 ;一位负数输出
L0: ;X=0输出
MOV AX,5
JMP OUTPUT2 ;一位负数输出
LFU:
LEA DX,OUT_MSG ;输出提示符
MOV AH,9
INT 21H
MOV AH,2 ;对于输出为负数的先输出负号,调用二号指令
MOV DL,'-' ;负号的acill码付给dl
INT 21H ;输出
MOV BX,X ;BX=X
MOV AX,X ;AX=X
ADD AX,BX ;AX=AX+X=2*X
ADD AX,BX ;AX=AX+BX=3*X
ADD AX,5 ;AX=AX*3-5
MOV BL,10 ;给bl赋值为10
DIV BL ;AX=AX/10
MOV DX,AX ;将AX赋值给DX
ADD DX,3030H ;把两字节的非压缩BCD码转成可以显示的ASCII码
MOV AH,2
INT 21H
MOV DL,DH ;将高四位付给低四位输出,两位数且已经转化为ascii码
MOV AH,2
INT 21H
JMP OVER ;输出完毕,结束
LFU1:
LEA DX,OUT_MSG ;输出提示符
MOV AH,9
INT 21H
MOV AH,2 ;对于输出为负数的先输出负号,调用二号指令
MOV DL,'-' ;负号的acill码付给dl
INT 21H ;输出
MOV BX,X ;BX=X
MOV AX,X ;AX=X
ADD AX,BX ;AX=AX+X=2*X
ADD AX,BX ;AX=AX+BX=3*X
ADD AX,5 ;AX=AX*3-5
JMP OUTPUT1 ;无需输出提示符,直接出最后一位数字答案
COMP:CMP X,3 ;正数判断
JG L
CMP X,1 ;对1特殊处理
JE L11
CMP X,0 ;对0特殊处理
JE L0
L1: ;小于3且不等于0,1顺序执行
MOV BX,X ;BX=X
MOV AX,X ;AX=X
ADD AX,BX ;AX=AX+X=2*X
ADD AX,BX ;AX=AX+BX=3*X
SUB AX,5 ;AX=AX*3-5
JMP OUTPUT0 ;输出,第一类
L: ;赋值答案
MOV AX,6
JMP OUTPUT0
L11: ;X=1输出
MOV AX,2
JMP OUTPUT2 ;一位负数输出
L0: ;X=0输出
MOV AX,5
JMP OUTPUT2 ;一位负数输出
LFU:
LEA DX,OUT_MSG ;输出提示符
MOV AH,9
INT 21H
MOV AH,2 ;对于输出为负数的先输出负号,调用二号指令
MOV DL,'-' ;负号的acill码付给dl
INT 21H ;输出
MOV BX,X ;BX=X
MOV AX,X ;AX=X
ADD AX,BX ;AX=AX+X=2*X
ADD AX,BX ;AX=AX+BX=3*X
ADD AX,5 ;AX=AX*3-5
MOV BL,10 ;给bl赋值为10
DIV BL ;AX=AX/10
MOV DX,AX ;将AX赋值给DX
ADD DX,3030H ;把两字节的非压缩BCD码转成可以显示的ASCII码
MOV AH,2
INT 21H
MOV DL,DH ;将高四位付给低四位输出,两位数且已经转化为ascii码
MOV AH,2
INT 21H
JMP OVER ;输出完毕,结束
LFU1:
LEA DX,OUT_MSG ;输出提示符
MOV AH,9
INT 21H
MOV AH,2 ;对于输出为负数的先输出负号,调用二号指令
MOV DL,'-' ;负号的acill码付给dl
INT 21H ;输出
MOV BX,X ;BX=X
MOV AX,X ;AX=X
ADD AX,BX ;AX=AX+X=2*X
ADD AX,BX ;AX=AX+BX=3*X
ADD AX,5 ;AX=AX*3-5
JMP OUTPUT1 ;无需输出提示符,直接出最后一位数字答案
OUTPUT0:
LEA DX,OUT_MSG ;输出提示符
MOV AH,9
INT 21H
LEA DX,OUT_MSG ;输出提示符
MOV AH,9
INT 21H
OUTPUT1:
ADD AX,30H ;数字转化为数字字符
MOV BX,AX ;赋值
MOV AH,2 ;输出
MOV DL,BL
INT 21H
JMP OVER
OUTPUT2:
ADD AX,30H
MOV BX,AX
LEA DX,OUT_MSG ;输出提示符
MOV AH,9
INT 21H
MOV AH,2
MOV DL,'-'
INT 21H
MOV AH,2
MOV DL,BL
INT 21H
ADD AX,30H ;数字转化为数字字符
MOV BX,AX ;赋值
MOV AH,2 ;输出
MOV DL,BL
INT 21H
JMP OVER
OUTPUT2:
ADD AX,30H
MOV BX,AX
LEA DX,OUT_MSG ;输出提示符
MOV AH,9
INT 21H
MOV AH,2
MOV DL,'-'
INT 21H
MOV AH,2
MOV DL,BL
INT 21H
OVER:
MOV AX,4C00H
INT 21H
CODE ENDS
END START
MOV AX,4C00H
INT 21H
CODE ENDS
END START