瀏覽代碼

move SP setting

Peter Ferrie 3 年之前
父節點
當前提交
88e749ea79
共有 1 個文件被更改,包括 8 次插入2 次删除
  1. 8 2
      sectorlisp.S

+ 8 - 2
sectorlisp.S

@@ -36,13 +36,19 @@ kCdr:	.asciz	"CDR"				# ordering matters
 kCons:	.asciz	"CONS"				# ordering matters
 kEq:	.asciz	"EQ"				# needs to be last
 
-begin:	push	%cs				# that means ss = ds = es = cs
+begin:	xor	%sp,%sp				# use highest address as stack
+						# set independently of SS!
+						# 8088 doesn't stop interrupts
+						# after SS is set, and PC BIOS
+						# sets SP to a value that will
+						# damage our code if int fires
+						# between setting SS and SP
+	push	%cs				# that means ss = ds = es = cs
 	pop	%ds				# noting ljmp set cs to 0x7c00
 	push	%cs				# that's the bios load address
 	pop	%es				# therefore NULL points to NUL
 	push	%cs				# terminated NIL string above!
 	pop	%ss				# errata exists but don't care
-	xor	%sp,%sp				# use highest address as stack
 	mov	$2,%bx
 main:	mov	$0x8000,%cx			# dl (g_look) is zero or cr
 	call	GetToken