【微机原理与汇编】有符号数输出

实现:输入一个数 判断正负并输出源数据
大致思路:

设置一个flag 记录正负
正数 直接存内存然后输出
负数 neg 以负数的形式存入内存
输出的时候 neg 回去调用正数的output函数
前面加一个’-'以-XX的形式输出


DATAS SEGMENT
    ;此处输入数据段代码  0正 1负数
    STR1 DB 'Please input a number:',13,10,'$'
    STR2 DB 'Output:',13,10,'$'
    ARR  DW 10 DUP(0)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    LEA DX ,OFFSET STR1
    MOV AH,9
    INT 21H; 提示语句STR1
    
    MOV SI,OFFSET ARR
    CALL INPUT
    
    LEA DX ,OFFSET STR2
    MOV AH,9
    INT 21H; 提示语句STR2
    
    MOV AX,[SI]
    MOV BX,AX
    AND BX,8000H
    JZ L0;与的结果是0 代表是正数 跳到L0
    
    ;若为负数 先将负数转换为正数 在输出(内存区存的是负数)
    NEG AX
    MOV BX,AX
    
    MOV DL,'-'
    MOV AH,2
    INT 21H
    MOV AX,BX  ;OUTPUT 入口函数是AX
    
    
L0:
  
    CALL OUTPUT
    MOV AH,4CH
    INT 21H

INPUT PROC
	PUSH AX
	PUSH BX
	PUSH DX
	MOV BL,10
	JMP L1
SIG :
	MOV CL,1 ;标志 =1为负数 =0正数
L1:
	MOV AH,1
	INT 21H
	CMP AL,'-'
	JE SIG
	CMP AL,'0'
	JB L2
	CMP AL,'9'
	JA L2
	
	MOV AH,0
	SUB AL,48
	MOV DX,AX;当前输入的数据存入DX
	
	MOV AL,[SI] ;取出内存已有的数据*10
	MUL BL
	
	ADD AX,DX;[SI]*10+DX=输入的数据
	MOV [SI],AX
	JMP L1
L2:
	CMP CL,1
	JNE OVER
	;负数取NEG 以负数的形式存
	MOV AX,[SI]
    NEG AX
    MOV [SI],AX
OVER:
	POP DX
	POP BX
	POP AX
	RET
INPUT ENDP
    
OUTPUT PROC;入口参数AX
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	MOV BL,10;乘数
	MOV BH,0;入栈次数
L3:	
	CMP AX,0
	JE PRINT
	DIV BL  ;商-AL 余数-AH
	INC BH;计数器加一 
	
	MOV CL,AL ;存商 接着除
	MOV AL,AH
	MOV AH,0  ;AX=AL
	
	PUSH AX
	;压栈 只有余数
	MOV AL,CL
	JMP L3
PRINT:
	CMP BH,0;出栈
	JE OVER
	POP DX
	DEC BH;计数器--
	ADD DL,48
	MOV AH,2
	INT 21H
	JMP PRINT
OVER:
	POP DX
	POP CX
	POP BX
	POP AX	
	RET
OUTPUT ENDP

CODES ENDS
    END START

【微机原理与汇编】有符号数输出_第1张图片

你可能感兴趣的:(微机原理与汇编语言,#,实验,微机原理,汇编,单片机)