Пользователь
Регистрация: 11.11.2015
Сообщений: 11
|
Реализация разветвленного алгоритма на Ассемблере
Доброго времени суток!
Помогите объединить 2 куска кода в один. В первом реализовано ввод целого числа, его проверку на корректный ввод, и вывод на экран. А второй - это код решающий систему уравнений из вложений. Как мне объединить эти два кода в один? Чтобы в зависимости от введенного "Х" решалось соответственное уравнение.
1-й кусок кода:
Код:
STSEG SEGMENT PARA STACK "STACK"
DB 64 DUP(00h)
STSEG ENDS
DSEG SEGMENT PARA PUBLIC "DATA"
OUT_MESS db 'Enter an integer number (from -9999 to 9999): ', '$'
ERROR DB 10,"Wrong input, you should enter an integer number from -9999 to 9999!!!",10,13,'$'
OUT_MES DB 10,"Your entered number = ",'$'
REP_MES DB 10,13,"If you want to repeat, press 'y' or any key...",10,13,'$'
IN_NUMB DB 6,'*',6 DUP('?')
SHIFT DB 0
TEN DW 1
NUMBER DW 00h
DSEG ENDS
CSEG SEGMENT PARA PUBLIC "CODE"
MAIN PROC FAR
ASSUME SS:STSEG, CS:CSEG, DS:DSEG
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DSEG
MOV DS,AX
START: MOV AL,6
MOV IN_NUMB,AL
LEA DX,OUT_MESS
MOV AH,09H
INT 21H
LEA DX,IN_NUMB
MOV AH,0AH
INT 21H
CALL P_STR
CMP CX,00h
JE ERR_IN
LEA DX,OUT_MES
MOV AH,09H
INT 21H
CALL OUT_STR
ERR_IN: MOV AL,2
MOV IN_NUMB,AL
LEA DX,REP_MES
MOV AH,09h
INT 21h
LEA DX,IN_NUMB
MOV AH,0AH
INT 21H
CMP IN_NUMB+2,'Y'
JE START
CMP IN_NUMB+2,'y'
JE START
RET
MAIN ENDP
P_STR PROC NEAR
LEA BX,IN_NUMB
MOV AL,'-'
CMP AL,IN_NUMB+2
JE RI_ZN
MOV AL,'+'
CMP AL,IN_NUMB+2
JE RI_ZN
MOV AL,30h
CMP AL,IN_NUMB+2
JE RInp
MOV AL,00h
CMP AL,[IN_NUMB+1]
JE INC_INP
MOV DL,05H
CMP IN_NUMB+1,DL
JB RInp
JMP NO_ST
RInp:
MOV AL,02h
MOV SHIFT,AL
JMP GO_1_SYM
RI_ZN: MOV AL,03h
MOV SHIFT,AL
MOV AL,-1h
ADD IN_NUMB+1,AL
GO_1_SYM: XOR CX,CX
XOR DX,DX
XOR AX,AX
MOV AL,SHIFT
ADD BX,AX
MOV AL,[BX]
CYCLE: ADD AL,-30H
JS INC_INP
CMP AL,09h
JG INC_INP
PUSH AX
INC BX
MOV AL,[BX]
CMP AL,0Dh
JNE CYCLE
XOR AX,AX
INC AX
MOV CL,IN_NUMB+1
MOV NUMBER,DX
TO_NUMB: MOV TEN,AX
POP BX
MUL BX
ADD NUMBER,AX
MOV AX,10
MUL TEN
LOOP TO_NUMB
MOV CX,01h
MOV DL,IN_NUMB+2
CMP DL,'-'
JNE P_END
MOV AX, NUMBER
NEG AX
MOV NUMBER, AX
P_END: RET
INC_INP:
XOR DX,DX
LEA AX,IN_NUMB
MOV DL,SHIFT
SUB BX,DX
SUB BX,AX
JZ NO_ST
MOV CX,BX
IS_ST: POP BX
LOOP IS_ST
NO_ST:
LEA DX,ERROR
MOV AH,09H
INT 21H
MOV CX,00h
RET
P_STR ENDP
OUT_STR PROC NEAR
MOV AX,NUMBER
CMP AX,00h
JGE DOD
NEG AX
MOV NUMBER,AX
MOV AH,02h
MOV DX,'-'
INT 21h
DOD: XOR DX,DX
XOR CX,CX
MOV BX,0Ah
MOV AX,NUMBER
OUT_SYM: IDIV BX
ADD DX,30h
PUSH DX
INC CX
XOR DX,DX
CMP AX,00h
JNE OUT_SYM
MOV AH,02h
OUT_S: POP DX
INT 21h
LOOP OUT_S
RET
OUT_STR ENDP
CSEG ENDS
END MAIN
И 2-й кусок:
Код:
mov eax,x
cmp eax,-1
jl v1
jg v2
xor eax,eax
jmp v3
v1: dec eax
jmp v3
v2:
lea ecx,[eax*2+1]
mov eax,x
sal eax,1
imul eax
mov ebx,eax
mov eax,x
imul x
imul x
add eax,ebx
add eax,11
cdq
idiv ecx
v3: mov z,eax
|