|
|
1.1 root 1: / Coherent C library
2: / i8086 small model
3:
4: .globl setjmp_
5: .globl longjmp_
6:
7: / #include <setjmp.h>
8: / int
9: / setjmp(env);
10: / jmp_buf env;
11: /
12: / int
13: / longjmp(env, value);
14: / jmp_buf env;
15: / int value;
16: /
17: / These two routines implement non local gotos. "setjmp" treasures away,
18: / int the supplied "env", the frame pointer, the stack pointer and the
19: / return address. It then returns 0. A call to "longjmp" restores the stack
20: / to that saved in the "env", and causes the call to "setjmp" to return
21: / again, returning "value".
22:
23: setjmp_:
24: pop cx / cx = return address.
25:
26: mov bx, sp / bx = pointer to the
27: mov bx, 0(bx) / env. block.
28: mov 0(bx), bp / save frame.
29: mov 2(bx), sp / save stack (ret addr popped).
30: mov 4(bx), cx / save ret addr.
31:
32: sub ax, ax / return 0 to the
33: ijmp cx / caller.
34:
35: longjmp_:
36: mov bx, sp / point bx into the stack and
37: mov ax, 4(bx) / grab the value
38: mov bx, 2(bx) / and the saved env. pointer.
39:
40: mov cx, 0(bx) / cx is desired bp.
41:
42: l0: cmp cx, 0(bp) / correct frame ??
43: je l1 / yes.
44: mov bp, 0(bp) / unwind a frame.
45: or bp, bp / hit top ??
46: jne l0 / nope, unwind another.
47:
48: mov bp, cx / take a stab at
49: jmp l2 / restoring the frame.
50:
51: l1: mov sp, bp / reset stack to correct place
52: pop bp / and restore frame
53: pop di / and the two
54: pop si / register variables.
55:
56: l2: mov sp, 2(bx) / reload sp and
57: ijmp 4(bx) / return from the setjmp.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.