;11Push86.asm ; Program demonstruje chybu v instrukci PUSH SP v 8086. DATA SEGMENT PUBLIC USE16 'DATA' ; Segment podle 16bitovych pravidel. Chyba db 'Ruzne SP pred PUSH SP a po POP SP !',10,13,'$' Stejne db 'SP v zasobniku je stejne jako pred PUSH SP.',10,13,'$' Mensi db 'SP v zasobniku je o 2 mensi nez pred PUSH SP.',10,13,'$' DATA ENDS ; STKSEG SEGMENT STACK USE16 'STACK' ; Zasobnik podle 16bitovych pravidel. DB 1024 DUP(?) ; Hloubka zasobniku je 1KB. STKSEG ENDS ; CODE SEGMENT PUBLIC USE16 'CODE' ; Vlastni program v segmentu opet ASSUME CS:CODE,SS:STKSEG,DS:DATA ; podle 16bitovych pravidel. ; PROCES PROC ; Toto je vstupni bod programu. Sem se preda rizeni. mov AX,DATA ; Segmentovy registr DS naplnime segmentovou mov DS,AX ; casti adresy segmentu pojmenovaneho DATA. mov DX,SP ; DX := SP push SP ; Uloz SP do zasobniku (v DX zustal oroginal). pop SP ; Vyber SP ze zasobniku. cmp DX,SP ; Je nove SP stejne s originalem? je Shoda ; Ano, je stejne. mov AH,9 ; Ne, jsou rozdilne, oznam to. mov DX,OFFSET Chyba int 21h Shoda: mov DX,SP ; Jeste jednou DX := SP. push SP ; Jeste jednou uloz do zasobniku SP. pop CX ; Vyber hodnotu ulozenou do zasobniku ; (tentokrat ne jako SP!). cmp DX,CX ; Odpovida vybrana hodnota ukladane? jne Ruzne ; Ne, jsou ruzne. mov AH,9 ; Ano, jsou stejne - oznam to. mov DX,OFFSET Stejne int 21h jmp Konec ; A konec. Ruzne: add DX,-2 ; Zmensi original o 2. cmp DX,CX ; Odpovida to kopii vybrane ze zasobniku? jne Konec ; Ne, je to jiny pripad - konec. mov AH,9 ; Ano, oznam, ze "SP v zasobniku je o 2 mov DX,OFFSET Mensi ; mensi nez pred PUSH SP." int 21h Konec: mov AH,4Ch ; Konec programu sluzbou MS-DOSu cislo 4Ch int 21h ; a navrat do MS-DOSu. PROCES ENDP CODE ENDS ; Konec programu. END PROCES