Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- STEG SEGMENT PARA STACK "STACK"
- DB 64 DUP("STACK")
- STEG ENDS
- DSEG SEGMENT PARA PUBLIC "DATA"
- HELLO_STRING DB 'Enter your number from -333 to 333: ',13,10,'$'
- OUTPUT_STRING DB 13,10,"Your number: ",'$'
- ERROR_STRING DB 13,10,'Error! Incorrect input!',13,10,'$'
- INPUT DB 5,?,5 DUP('$')
- IS_NEGATIVE DB 1 DUP('0')
- DSEG ENDS
- CSEG SEGMENT PARA PUBLIC "CODE"
- MAIN PROC FAR
- assume SS:STEG, DS:DSEG, CS:CSEG
- PUSH DS
- PUSH AX
- XOR AX, AX; MOV AX,0
- MOV AX, DSEG
- MOV DS, AX
- CALL INPUT_NUMBER
- CALL OUTPUT_NUMBER
- mov ah, 08h;ah - elder bite of AX. 8(read 1 symbol)2(outout 1 symb)9(str on screen)10(read str to enter)
- int 21h
- mov ax,4C00h;dos func exit from program
- int 21h
- MAIN ENDP
- INPUT_NUMBER PROC NEAR;near 128 byte stack
- MOV AH, 9;output str
- LEA DX, HELLO_STRING
- INT 21H
- LEA DX, INPUT
- MOV AH, 10;read line
- INT 21H
- LEA DI, INPUT+2
- MOV AL, [DI]
- CMP AL, '-';zf 1
- JE NEGATIVE;if zf==1
- CMP AL,'+'
- JE POSITIVE
- LABEL1:
- XOR BX,BX;bx==0
- MOV BX,10
- XOR AX,AX
- LABEL2:
- XOR CX,CX ; ERROR SYMBOL
- CMP BYTE PTR [DI], 0DH;compare 3rd+ byte==$
- JZ LABEL5;if zf==1 ->
- CMP BYTE PTR [DI], 30H;<0
- JB ERROR;if cf==1 ->
- CMP BYTE PTR [DI], 39H;>9
- JA ERROR;if cd,zf==0,0
- MOV CL, [DI]
- SUB CL, 30H;cl=cl-30h translate to hex
- MUL BX ;AX=BX*AX MUL (BX==10)
- JC ERROR;(65512)if cf==0 ->
- ADD AX,CX;AX+CX
- JC ERROR
- INC DI;DI++
- JMP LABEL2;if CX!=0 then ->
- NEGATIVE:
- PUSH AX;put in stack
- MOV AL, 1
- MOV IS_NEGATIVE, AL
- POP AX;get from stack
- INC DI
- JMP LABEL1
- POSITIVE:
- PUSH AX
- MOV AL, 0
- MOV IS_NEGATIVE, AL
- POP AX
- INC DI
- JMP LABEL1
- ERROR:
- MOV AH, 9
- LEA DX, ERROR_STRING
- INT 21H
- mov ah, 08h
- int 21h
- mov ax,4C00h
- int 21h
- LABEL5:
- CMP AX, 333;zf,cf = 0,0
- JA ERROR
- MOV CL, IS_NEGATIVE
- CMP CL, 1;if cl==1 then zf=1
- JNZ L6; if zf!=0 call ->
- NEG AX;*(-1)
- L6: RET;return
- INPUT_NUMBER ENDP
- OUTPUT_NUMBER PROC NEAR
- MOV CX, AX;for jumper
- MOV AH, 9
- LEA DX, OUTPUT_STRING
- INT 21H
- MOV AX,CX
- MOV BL, IS_NEGATIVE
- CMP BL, 1
- JNZ POS;zf!=0->
- MOV AH,2;interrupt 1 symbol
- MOV DL, '-'
- INT 21H
- MOV AX,CX
- NEG AX
- POS:
- XOR CX,CX ;CX = 0
- XOR BX,BX
- MOV BX,10 ;BL=10
- L1:
- XOR DX,DX
- DIV BX ; AX /(DIVIDE) BX RESULT DX
- PUSH DX
- INC CX
- TEST AX,AX ; IF AX = 0, ZF = 1
- JNZ L1
- MOV AH,2
- L2:
- POP DX
- ADD DL, 30H;translate to dec
- INT 21H
- LOOP L2;while cx !=0->
- RET
- OUTPUT_NUMBER ENDP
- CSEG ENDS
- END MAIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement