Professional Documents
Culture Documents
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV BL,DL
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
MOV CL,00H
ADD BL,DL
JNC NEXT
INC CL
NEXT:CALL DISP
MOV AH,4CH
INT 21H
MOV AH,01H
INT 21H
MOV DL,AL
MOV CL,04H
SUB DL,30H
CMP DL,0AH
JC R1
SUB DL,07H
R1:SHL DL,CL
MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JC R2
SUB AL,07H
R2:AND AL,0FH
OR DL,AL
RET
READ ENDP
LEA DX,MESS3
MOV AH,09H
INT 21H
MOV DL,CL
ADD DL,30H
MOV AH,06H
INT 21H
MOV CL,04H
MOV DL,BL
SHR DL,CL
CMP DL,0AH
JC L1
ADD DL,07H
L1:ADD DL,30H
MOV AH,06H
INT 21H
AND BL,0FH
CMP BL,0AH
JC L2
ADD BL,07H
L2:ADD BL,30H
MOV DL,BL
MOV AH,06H
INT 21H
RET
DISP ENDP
CODE ENDS
END START
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV BX,DX
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
MOV CL,00H
ADD BX,DX
JNC NEXT
INC CL
NEXT:CALL DISP
MOV AH,4CH
INT 21H
MOV CH,02H
R3:MOV AH,01H
INT 21H
MOV CL,04H
MOV DL,AL
SUB DL,30H
CMP DL,0AH
JC R1
SUB DL,07H
R1:SHL DL,CL
MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JC R2
SUB AL,07H
AND AL,0FH
R2:OR DL,AL
DEC CH
JZ R4
MOV DH,DL
JMP R3
R4:RET
READ ENDP
LEA DX,MESS3
MOV AH,09H
INT 21H
MOV DL,CL
ADD DL,30H
MOV AH,06H
INT 21H
MOV CH,02H
L3:MOV CL,04H
MOV DL,BH
SHR DL,CL
CMP DL,0AH
JC L1
ADD DL,07H
L1:ADD DL,30H
MOV AH,06H
INT 21H
AND BH,0FH
CMP BH,0AH
JC L2
ADD BH,07H
L2:ADD BH,30H
MOV DL,BH
MOV AH,06H
INT 21H
DEC CH
JZ L4
MOV BH,BL
JMP L3
L4:RET
DISP ENDP
CODE ENDS
END START
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV BL,DL
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
MOV CL,00H
SUB BL,DL
JNC NEXT
NEG BL
MOV CL,'-'
NEXT:CALL DISP
MOV AH,4CH
INT 21H
MOV AH,01H
INT 21H
MOV DL,AL
MOV CL,04H
SUB DL,30H
CMP DL,0AH
JC R1
SUB DL,07H
R1:SHL DL,CL
MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JC R2
SUB AL,07H
R2:AND AL,0FH
OR DL,AL
RET
READ ENDP
MOV AH,09H
INT 21H
MOV DL,CL
ADD DL,30H
MOV AH,06H
INT 21H
MOV CL,04H
MOV DL,BL
SHR DL,CL
CMP DL,0AH
JC L1
ADD DL,07H
L1:ADD DL,30H
MOV AH,06H
INT 21H
AND BL,0FH
CMP BL,0AH
JC L2
ADD BL,07H
L2:ADD BL,30H
MOV DL,BL
MOV AH,06H
INT 21H
RET
DISP ENDP
CODE ENDS
END START
16 bit hexadecimal subtration
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV BX,DX
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
SUB BX,DX
MOV CL,00H
JNC NEXT
INC CL
MOV CL,'-'
NEG BX
MOV AH,4CH
INT 21H
INT 21H
MOV CL,04H
MOV DL,AL
SUB DL,30H
CMP DL,0AH
JC R1
SUB DL,07H
R1:SHL DL,CL
MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JC R2
SUB AL,07H
OR DL,AL
DEC CH
JZ R4
MOV DH,DL
JMP R3
R4:RET
READ ENDP
LEA DX,MESS3
MOV AH,09H
INT 21H
MOV DL,CL
MOV AH,06H
INT 21H
MOV CH,02H
L3:MOV CL,04H
MOV DL,BH
SHR DL,CL
CMP DL,0AH
JC L1
ADD DL,07H
L1:ADD DL,30H
MOV AH,06H
INT 21H
AND BH,0FH
CMP BH,0AH
JC L2
ADD BH,07H
L2:ADD BH,30H
MOV DL,BH
MOV AH,06H
INT 21H
DEC CH
JZ L4
MOV BH,BL
JMP L3
L4:RET
DISP ENDP
CODE ENDS
END START
MULTIPLICATION OF TWO 8-BIT HEXADECIMAL NUMBERS
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV BX,DX
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
MOV AX,BX
MUL DL
MOV BX,AX
CALL DISP
MOV AH,4CH
INT 21H
MOV AH,01H
INT 21H
MOV DL,AL
MOV CL,04H
SUB DL,30H
CMP DL,0AH
JC R1
SUB DL,07H
R1:SHL DL,CL
MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JC R2
SUB AL,07H
R2:AND AL,0FH
OR DL,AL
RET
READ ENDP
LEA DX,MESS3
MOV AH,09H
INT 21H
MOV CH,02H
L3:MOV CL,04H
MOV DL,BH
SHR DL,CL
CMP DL,0AH
JC L1
ADD DL,07H
L1:ADD DL,30H
MOV AH,06H
INT 21H
AND BH,0FH
CMP BH,0AH
JC L2
ADD BH,07H
L2:ADD BH,30H
MOV DL,BH
MOV AH,06H
INT 21H
DEC CH
JZ L4
MOV BH,BL
JMP L3
L4:RET
DISP ENDP
CODE ENDS
END START
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV BX,DX
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
MOV AX,BX
MUL DX
MOV BX,DX
MOV SI,AX
CALL DISP
MOV AH,4CH
INT 21H
MOV CH,02H
INT 21H
MOV CL,04H
MOV DL,AL
SUB DL,30H
CMP DL,0AH
JC R1
SUB DL,07H
R1:SHL DL,CL
MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JC R2
SUB AL,07H
OR DL,AL
DEC CH
JZ R4
MOV DH,DL
JMP R3
R4: RET
READ ENDP
LEA DX,MESS3
MOV AH,09H
INT 21H
MOV CH,04H
MOV CL,04H
SHR DL,CL
CMP DL,0AH
JC L1
ADD DL,07H
MOV AH,06H
INT 21H
AND BH,0FH
CMP BH,0AH
JC L2
ADD BH,07H
L2:ADD BH,30H
MOV DL,BH
MOV AH,06H
INT 21H
DEC CH
JZ L4
MOV BH,BL
CMP CH,03H
JNZ L5
MOV DX,SI
L5:MOV BL,DH
MOV DH,DL
JMP L3
L4:RET
DISP ENDP
CODE ENDS
END START
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV BL,DL
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
MOV AH,00H
MOV AL,BL
DIV DL
MOV BH,AL
MOV AL,00H
DIV DL
MOV BL,AL
CALL DISP
MOV AH,4CH
INT 21H
MOV AH,01H
INT 21H
MOV DL,AL
MOV CL,04H
SUB DL,30H
CMP DL,0AH
JC R1
SUB DL,07H
R1:SHL DL,CL
MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JC R2
SUB AL,07H
R2:AND AL,0FH
OR DL,AL
RET
READ ENDP
LEA DX,MESS3
MOV AH,09H
INT 21H
MOV CH,02H
LP1:MOV CL,04H
MOV DL,BH
SHR DL,CL
CMP DL,0AH
JC L1
ADD DL,07H
L1:ADD DL,30H
MOV AH,06H
INT 21H
AND BH,0FH
CMP BH,0AH
JC L2
ADD BH,07H
L2:ADD BH,30H
MOV DL,BH
MOV AH,06H
INT 21H
DEC CH
JZ NXT
MOV DL,'.'
MOV AH,06H
INT 21H
MOV BH,BL
JMP LP1
NXT:RET
DISP ENDP
CODE ENDS
END START
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV BX,DX
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
MOV SI,DX
MOV DX,0000H
MOV AX,BX
DIV SI
MOV BX,AX
MOV AX,0000H
DIV SI
MOV SI,AX
CALL DISP
MOV AH,4CH
INT 21H
MOV CH,02H
R3:MOV AH,01H
INT 21H
MOV CL,04H
MOV DL,AL
SUB DL,30H
CMP DL,0AH
JC R1
SUB DL,07H
R1:SHL DL,CL
MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JC R2
SUB AL,07H
AND AL,0FH
R2:OR DL,AL
DEC CH
JZ R4
MOV DH,DL
JMP R3
R4:RET
READ ENDP
LEA DX,MESS3
MOV AH,09H
INT 21H
MOV CH,02H
MOV CL,04H
MOV DL,BH
SHR DL,CL
CMP DL,0AH
JC L1
ADD DL,07H
L1:ADD DL,30H
MOV AH,06H
INT 21H
AND BH,0FH
CMP BH,0AH
JC L2
ADD BH,07H
L2:ADD BH,30H
MOV DL,BH
MOV AH,06H
INT 21H
BACK:MOV DL,BL
SHR DL,CL
CMP DL,0AH
JC L3
ADD DL,07H
L3:ADD DL,30H
MOV AH,06H
INT 21H
AND BL,0FH
CMP BL,0AH
JC L4
ADD BL,07H
L4:ADD BL,30H
MOV DL,BL
MOV AH,06H
INT 21H
DEC CH
JZ NXT
MOV DL,'.'
MOV AH,06H
INT 21H
MOV BX,SI
MOV BL,BH
JMP BACK
NXT:RET
DISP ENDP
CODE ENDS
END START
Hex to binary
DATA SEGMENT
BSTR DB 20 DUP("$")
RSTR DB 20 DUP("$")
NEWLINE DB 13,10,"$"
CNT DB 0
N DB 2
H DB 16
D DB 10H
NUM DB ?
SNUM DB ?
HNUM DB 14H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV CX,00
MOV DX,00
L6:MOV AX,00
MOV AL,HNUM
DIV D
MOV HNUM,AL
MOV BX,AX
MOV CL,CNT
MOV AX,1
JE L7
MUL H
SUB CL,1
JMP L5
L7: MUL BH
ADD DX,AX
ADD CNT,1
CMP HNUM,0
JG L6
MOV NUM,DL
LEA SI,BSTR
LEA DI,RSTR
MOV AL,NUM
DIV N
ADD AH,30H
INC SI
MOV NUM,AL
CMP AL,0
JG L1
DEC SI
DEC SI
INC DI
CMP SI,0
JNE L2
MOV AH,09H
LEA DX,STR1
INT 21H
MOV AH,09H
LEA DX,RSTR
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
Hex to Decimal
name "hex"
org 100h
jmp start
source db '1c', 0
result db '000', 0
temp dw ?
start:
jae f1
f1:
ja f2
jmp num1_ready
f2:
or al, 00100000b
mov bl, 16
mul bl
mov temp, ax
jae g1
g1:
ja g2
jmp num2_ready
g2:
or al, 00100000b
num2_ready:
xor ah, ah
add temp, ax
push temp
mov di, 2
next_digit:
cmp temp, 0
je stop
mov bl, 10
div bl
mov result[di], ah
xor ah, ah
mov temp, ax
dec di
jmp next_digit
stop:
pop temp
mov cx, 8
jz zero
shl bl, 1
loop print
int 21h
mov ah, 0
int 16h
ret
favtorial
name "fact"
push ax
int 10h
pop ax
endm
org 100h
jmp start
result dw ?
start:
mov ah, 9
int 21h
jmp n1
n1:
call scan_num
mov ax, 1
cmp cx, 0
je print_result
mov bx, cx
mov ax, 1
mov bx, 1
calc_it:
mul bx
cmp dx, 0
jne overflow
inc bx
loop calc_it
mov result, ax
print_result:
mov ah, 9
int 21h
jmp n2
n2:
call print_num_uns
jmp exit
overflow:
mov ah, 9
int 21h
jmp n3
msg3 db 0Dh,0Ah, 'the result is too big!', 0Dh,0Ah, 'use values from 0 to 8.$'
n3:
jmp start
exit:
mov ah, 0
int 16h
ret
PUSH DX
PUSH AX
PUSH SI
MOV CX, 0
MOV CS:make_minus, 0
next_digit:
INT 16h
INT 10h
JE set_minus
JNE not_cr
JMP stop_input
not_cr:
CMP AL, 8
JNE backspace_checked
MOV DX, 0
MOV AX, CX
DIV CS:ten
MOV CX, AX
PUTC 8
JMP next_digit
backspace_checked:
JAE ok_AE_0
JMP remove_not_digit
ok_AE_0:
JBE ok_digit
remove_not_digit:
PUTC 8
PUTC 8
JMP next_digit
ok_digit:
PUSH AX
MOV AX, CX
MUL CS:ten
MOV CX, AX
POP AX
CMP DX, 0
JNE too_big
MOV DX, CX
ADD CX, AX
JC too_big2
JMP next_digit
set_minus:
MOV CS:make_minus, 1
JMP next_digit
too_big2:
MOV CX, DX
MOV DX, 0
too_big:
MOV AX, CX
DIV CS:ten
MOV CX, AX
PUTC 8
PUTC 8
JMP next_digit
stop_input:
CMP CS:make_minus, 0
JE not_minus
NEG CX
not_minus:
POP SI
POP AX
POP DX
RET
make_minus DB ?
SCAN_NUM ENDP
PRINT_NUM PROC NEAR
PUSH DX
PUSH AX
CMP AX, 0
JNZ not_zero
PUTC '0'
JMP printed
not_zero:
CMP AX, 0
JNS positive
NEG AX
PUTC '-'
positive:
CALL PRINT_NUM_UNS
printed:
POP AX
POP DX
RET
PRINT_NUM ENDP
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX, 1
CMP AX, 0
JZ print_zero
begin_print:
CMP BX,0
JZ end_print
CMP CX, 0
JE calc
CMP AX, BX
JB skip
calc:
MOV CX, 0
MOV DX, 0
DIV BX
PUTC AL
MOV AX, DX
skip:
PUSH AX
MOV DX, 0
MOV AX, BX
DIV CS:ten
MOV BX, AX
POP AX
JMP begin_print
print_zero:
PUTC '0'
end_print:
POP DX
POP CX
POP BX
POP AX
RET
PRINT_NUM_UNS ENDP
ten DW 10
Fibonacci
DATA SEGMENT
TEMP DB 01H
COUNT DB 00H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV CH,DL
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
MOV BL,CH
CALL DISP
LEA DX,MESS4
MOV AH,09H
INT 21H
XOR BX,BX
CALL DISP
ADD TEMP,BH
JC NEXT
MOV BL,TEMP
MOV TEMP,BH
MOV BH,BL
CMP BL,CH
JA NEXT
JMP AGAIN
NEXT:LEA DX,MESS3
MOV AH,09H
INT 21H
MOV AL,COUNT
ADD AL,00H
DAA
MOV BL,AL
CALL DISP
MOV AH,4CH
INT 21H
MOV CL,04H
MOV AH,01H
INT 21H
MOV DL,AL
MOV CL,04H
SUB DL,30H
CMP DL,0AH
JC R1
SUB DL,07H
R1:SHL DL,CL
MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JC R2
SUB AL,07H
OR DL,AL
RET
READ ENDP
MOV AH,06H
INT 21H
MOV DL,BL
SHR DL,CL
CMP DL,0AH
JC L1
ADD DL,07H
MOV AH,06H
INT 21H
AND BL,0FH
CMP BL,0AH
JC L2
ADD BL,07H
L2: ADD BL,30H
MOV DL,BL
MOV AH,06H
INT 21H
RET
DISP ENDP
CODE ENDS
END START
Or another fibonacci
DATA SEGMENT
TEMP DB 01H
COUNT DB 00H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
CALL READ
MOV CH,DL
LEA DX,MESS2
MOV AH,09H
INT 21H
CALL READ
MOV BL,CH
CALL DISP
LEA DX,MESS4
INT 21H
XOR BX,BX
CALL DISP
MOV AL,TEMP
ADD AL,BH
DAA
JC NEXT
MOV BL,AL
MOV TEMP,BH
MOV BH,BL
CMP BL,CH
JA NEXT
JMP AGAIN
NEXT:LEA DX,MESS3
MOV AH,09H
INT 21H
MOV AL,COUNT
ADD AL,00H
DAA
MOV BL,AL
CALL DISP
MOV AH,4CH
INT 21H
READ PROC NEAR
MOV CL,04H
MOV AH,01H
INT 21H
SHL AL,CL
MOV DL,AL
MOV AH,01H
INT 21H
AND AL,0FH
OR DL,AL
RET
READ ENDP
MOV AH,06H
INT 21H
MOV DL,BL
SHR DL,CL
ADD DL,30H
MOV AH,06H
INT 21H
AND BL,0FH
ADD BL,30H
MOV DL,BL
MOV AH,06H
INT 21H
RET
DISP ENDP
CODE ENDS
END START
OUTPUT
sorting
name "sort"
push ax
int 10h
pop ax
endm
push ax
push bx
push dx
mov bh, 0
int 10h
pop dx
pop bx
pop ax
endm
data segment
cr equ 0dh
lf equ 0ah
dollar equ '$'
msg4 db cr, lf, cr, lf, "after sorting from biggest to smallest:", dollar
num1 dw ?
num2 dw ?
num3 dw ?
ends
stack segment
dw 100h dup(?)
ends
code segment
push ds
mov ax, 0
push ax
mov ds, ax
mov es, ax
call clear_screen
; position the cursor at row=3 and column=0
gotoxy 0, 3
mov num1, cx
mov num2, cx
mov num3, cx
; sorting:
mov num1, bx
mov num2, cx
mov num2, bx
mov num3, cx
mov num1, bx
mov num2, cx
call puts
call puts
call puts
call puts
call puts
mov ah, 0
int 16h
retf
start endp
push ax
int 21h
pop ax
ret
endp
cmp bx, cx
jge compared
xchg bx, cx
compared:
ret
endp
PUSH DX
PUSH AX
PUSH SI
MOV CX, 0
; reset flag:
MOV CS:make_minus, 0
next_digit:
; into AL:
INT 16h
INT 10h
JE set_minus
JNE not_cr
JMP stop_input
not_cr:
JNE backspace_checked
MOV CX, AX
JMP next_digit
backspace_checked:
JAE ok_AE_0
JMP remove_not_digit
ok_AE_0:
JBE ok_digit
remove_not_digit:
PUTC 8 ; backspace.
ok_digit:
PUSH AX
MOV AX, CX
MOV CX, AX
POP AX
CMP DX, 0
JNE too_big
; add AL to CX:
MOV AH, 0
ADD CX, AX
JMP next_digit
set_minus:
MOV CS:make_minus, 1
JMP next_digit
too_big2:
too_big:
MOV AX, CX
MOV CX, AX
PUTC 8 ; backspace.
stop_input:
; check flag:
CMP CS:make_minus, 0
JE not_minus
NEG CX
not_minus:
POP SI
POP AX
POP DX
RET
make_minus DB ?
SCAN_NUM ENDP
PUSH DX
PUSH AX
CMP AX, 0
JNZ not_zero
PUTC '0'
JMP printed
not_zero:
CMP AX, 0
JNS positive
NEG AX
PUTC '-'
positive:
CALL PRINT_NUM_UNS
printed:
POP AX
POP DX
RET
PRINT_NUM ENDP
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX, 1
; AX is zero?
CMP AX, 0
JZ print_zero
begin_print:
CMP BX,0
JZ end_print
CMP CX, 0
JE calc
CMP AX, BX
JB skip
calc:
MOV DX, 0
DIV BX
PUTC AL
MOV AX, DX
skip:
PUSH AX
MOV DX, 0
MOV AX, BX
POP AX
JMP begin_print
print_zero:
PUTC '0'
end_print:
POP DX
POP CX
POP BX
POP AX
RET
PRINT_NUM_UNS ENDP
ten DW 10
PUSH AX
PUSH DS
PUSH BX
PUSH CX
PUSH DI
MOV DS, AX
MOV AL, 0
MOV BH, 07
MOV CH, 0
MOV CL, 0
DEC DL
INT 10h
MOV BH, 0
MOV DL, 0
MOV DH, 0
MOV AH, 02
INT 10h
POP DI
POP CX
POP BX
POP DS
POP AX
RET
CLEAR_SCREEN ENDP
code ends
end start
string reversal
; reverse string
name "reverse"
org 100h
jmp start
mov si, bx
je found_the_end
inc si
jmp next_byte
found_the_end: dec si
jae done
mov [si], al
mov [bx], ah
inc bx
dec si
jmp do_reverse
int 21h
mov ah, 0
int 16h
ret
palindrome check
name "pali"
org 100h
jmp start
m1:
s_size = $ - m1
db 0Dh,0Ah,'$'
start:
mov ah, 9
int 21h
lea di, s
mov si, di
dec si
cmp cx, 1
je is_palindrome
shr cx, 1
next_char:
cmp al, bl
jne not_palindrome
inc di
dec si
loop next_char
is_palindrome:
mov ah, 9
int 21h
jmp stop
not_palindrome:
mov ah, 9
int 21h
stop:
mov ah, 0
int 16h
ret