第二波分段函数(汇编)

套用输出模板写的第二波分段函数,比第一个更具代表性,所有输出均通过模板一个部分

当x<-2时 y=x-3   当-2<=x<=3时,y=5x+6  当x>3时,y=2

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


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


     LEA   BX,BUFFER+2      ;判断第一个字符是否是负号只是输入时第一个数是个数
     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             ;跳入正数的第一个步骤


FU:                         ;负数输入
     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            ;循环
     MOV    X,AX            ;赋值给X
                      
COMPF:                      ;负数判断
     CMP    X,2            
     JG     LF              ;对于小于-2,执行LF
     CMP    X,2
     JE     L2FU            ;对-2的处理
     CMP    X,1
     JE     L1FU            ;对-1处理


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     L3


L03:                       ;小于等于3且大于等于0,1顺序执
     MOV    BX,X            ;BX=X
     MOV    AX,X            ;AX=X
     ADD    BX,BX           ;BX=BX+BX=2*X
     ADD    BX,BX           ;BX=BX+BX=4*X
     ADD    AX,BX           ;AX=AX+BX=5*X
     ADD    AX,6            ;AX=AX*5+6
     MOV    X,AX
     JMP    OUTPUT0


L3:  MOV    AX,2
     MOV    X,AX
     JMP    OUTPUT0
                        
LF:                         ;X<-2的处理
     MOV    AX,X
     ADD    AX,3
     MOV    X,AX
     JMP    OUTPUT0F


L1FU:                       ;X=-1的处理
     MOV    BX,X            ;BX=X
     MOV    AX,X            ;AX=X
     ADD    AX,BX           ;AX=AX+X=2*X
     ADD    AX,AX           ;AX=AX+AX=4*X
     ADD    AX,BX           ;AX=AX+BX=5*X
     MOV    BX,6
     SUB    BX,AX           ;BX=6-5*X
     MOV    X,BX
     JMP    OUTPUT0              


L2FU:                       ;对-2的处理
     
     MOV    BX,X            ;BX=X
     MOV    AX,X            ;AX=X
     ADD    BX,BX           ;BX=BX+BX=2*X
     ADD    BX,BX           ;BX=BX+BX=4*X
     ADD    AX,BX           ;AX=AX+BX=5*X
     SUB    AX,6            ;AX=AX*5+6
     MOV    X,AX
     JMP    OUTPUT0F


OUTPUT0: 
     LEA    DX,OUT_MSG  ;输出提示符
     MOV    AH,9
     INT    21H
     JMP    OUTPUT
OUTPUT0F:
     LEA    DX,OUT_MSG      ;输出提示符
     MOV    AH,9
     INT    21H
     MOV    AH,2            ;对于输出为负数的先输出负号,调用二号指令
     MOV    DL,'-'          ;负号的acill码付给dl
     INT    21H             ;输出


OUTPUT:                 ;多位数输出模板
        MOV  AX,X
        MOV  CX,0
ONEOUT:
        MOV  DX,0
        DIV  C10
        PUSH DX
        INC  CX
        CMP  AX,0
        JE   CLE
        JMP  ONEOUT


CLE:    POP  DX
        ADD  DL,30H
        MOV  AH,2
        INT  21H
        LOOP CLE
OVER:
     MOV    AX,4C00H
     INT    21H
CODE   ENDS
  END    START

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值