masm是4.0版本編譯通過。
我想升級到BorlandC3.1但是無法編譯通過。
是語法問題嗎?
VSTACK equ 600H ;stack size
extrn main:far
extrn putwindow:far
extrn putibm:far
DGROUP GROUP DATA,UDATA,XSTACK
ASSUME DS:DGROUP
_PROG SEGMENT BYTE PUBLIC 'PROG'
ASSUME CS:_PROG
;
PUBLIC CXINIT
CXINIT PROC FAR
jmp over
db 0,0,0,0,0,0,0,0,0,0,0,0,0 ;on seg boundary
vrtx32 proc far
DB 0EBH,03EH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
。。。。此處省略大量資料。。。。。
DB 010H,04AH,001H,05AH,00CH,05CH,011H,0E1H,011H,072H
DB 012H,0C7H,012H,03BH,013H,00DH,017H,047H,017H,0D4H
DB 017H,05DH,018H,0BBH,018H,03DH,01BH,021H,01EH
vrtx32 endp
over: CLI
cld ;direction
xor ax,ax
mov ss,ax
mov ax,380h
mov sp,ax
MOV AX,UDATA ; zero udata area
MOV ES,AX
XOR CX,CX
MOV DI,CX
XOR AL,AL
CLEARU: STOSB ;CLEAR UDATA MEMORY
LOOP CLEARU
MOV AX,XSTACK
MOV ES,AX
XOR CX,CX
MOV DI,CX
XOR AL,AL
CLEAR: STOSB ;CLEAR STACK MEMORY
LOOP CLEAR
MOV AX,DGROUP
MOV DS,AX
XOR AX,AX
mov macrokey,AX
mov macrokey+2,AX
MOV AX,VSTACK+1
MOV _TOP,AX ;top of stack
MOV AX,XSTACK
ADD AX,400H ;TO END OF VRTX
XOR SI,SI
XOR BX,BX
mov stacks,si
mov stacks+2,ax ;start of stack pointers
mov es,ax
add ax,40h ;room for 256 pointers
mov es:2,ax ;stack for task 0
mov dx,05feh ;top of stack for task 0
mov es:0,dx
add ax,060h ;reserve space for task 0 stack
mov dx,0ffffh
mov _pbox,dx
mov _pbox+2,dx
mov dx,0ffffh
mov _p2box,dx
mov _p2box+2,dx
MOV CX,5 ;NUMBER OF TERMINALS
SET: MOV BOFFSET[SI],AX ;SEG START
MOV TOPOINT[SI],BX
MOV FRPOINT[SI],BX
mov busywin2[si],bx
; mov curwind2[si],dx
INC SI
INC SI
ADD AX,buffsize/16 ;buffsize EACH
LOOP SET
MOV CX,AX ;SAVE IT
mov _psp+2,ax
MOV _MBASE+2,AX
MOV _MNEXT+2,AX
XOR BX,BX
MOV _MBASE,BX
MOV _MNEXT,BX
push ax
TRY: MOV ES,AX ;FIND RAM CONTINUOUS
; cmp ax,0afe0h ; this works for NT, but not 95
cmp ax,0b7e0h ; use some of video area
; use more memory now!
; cmp ax,09fe0h
ja istop
MOV BX,ES:0
INC BX
MOV ES:0,BX
CMP BX,ES:0 ;SAME YET?
JNE ISTOP ;NO-NO RAM
ADD AX,10H ;NEXT 256 BYTES
JMP TRY
ISTOP: SUB AX,90h ;GIVE SOME BACK TO DOS
POP ES ;GET START OF BLOCK
MOV DX,DX
MOV ES:0,DX
MOV ES:2,AX
MOV BX,AX
SUB AX,CX ;SIZE OF BLOCK
PUSH AX
MOV AX,ES
SUB BX,AX
MOV AH,4AH
; INT 21H ;FREE IT
POP AX
MOV _MSIZE,AX
; CALL RBRK
;
mov ax,0b000h ;mono screen
mov es,ax
MOV BX,ES:0
INC BX
MOV ES:0,BX
CMP BX,ES:0 ;SAME YET?
; jz ismono ;NO-NO RAM
mov ax,0b800h
ismono: mov bx,dgroup
mov ds,bx
mov disptype,ax ;save it for others
mov ax,2
mov cputype,ax ;ibm
;
;
; USER PRE-INIT CODE
;
CFTBL_PTR_OFF EQU WORD PTR 0200H ;CFTBL POINTER OFFSET
CFTBL_PTR_SEG EQU WORD PTR 0202H ;CFTBL POINTER SEGMENT
VRTX EQU WORD PTR 080H ;VRTX INTERRUPT
INT32_VCT EQU WORD PTR 204H ;VRTX INT VECTOR
INIT PROC FAR
MOV AX, 0 ;SET AX TO 0
MOV DS, AX ;COPY TO DS
MOV DS:CFTBL_PTR_SEG, SEG TBL ;CFTBL SEGMENT
MOV DS:CFTBL_PTR_OFF, OFFSET TBL ;CFTBL OFFSET
mov ax,0 ; assume offset is zero
MOV DS:INT32_VCT, AX ;LOAD IT
MOV AX, seg vrtx32 ;GET VRTX ENTRY (CS)
inc ax ; plus one because it starts at 80:10
MOV DS:INT32_VCT+2, AX ;LOAD IT
MOV AX,030H ;VRTX_INIT
INT 81H ;CALL VRTX
OR AX,AX ;ANY ERRORS ?
JZ P_INIT
jmp abort
P_INIT:
CALL TIMER_INIT
MOV BX, OFFSET MAIN ;CODE OFFSET OF TASK
MOV AX, SEG MAIN ;CODE SEGMENT OF TASK
MOV CL,4
ROL AX,CL
MOV CX,AX
AND AX,15
AND CX,0FFF0H
ADD BX,CX
ADC AX,0 ; (AX,BX) = LONG EQUIVALENT
MOV CX,BX
AND CX,15 ;SAVE NORMALIZED OFFSET
XCHG AX,BX
SHR BX,1 ;CONSTRUCT BASE VALUE
RCR AX,1
SHR BX,1
RCR AX,1
SHR BX,1
RCR AX,1
SHR BX,1
RCR AX,1
MOV BX,CX
MOV ES, AX ;PLACE SEGMENT IS ES
MOV CL, 0 ;ID = 0
MOV CH, 0 ;PRI = 0
MOV AX,DGROUP ; set up DS/SS for .EXE file
MOV DS,AX
MOV AX, 00H ;SC_TCREATE
INT 81H ;CALL VRTX
MOV AX, 31H ;VRTX_GO
INT 81H ;CALL VRTX, NO RETURN
;FROM THIS CALL
INIT ENDP
;
TBL LABEL BYTE
DW SEG XSTACK ;SYSTEM RAM START ADDRESS
DW 400H ;SYSTEM RAM SIZE
DW 0 ;RESERVED,MUST BE 0
DW 0 ;NO INTERRUPT STACK
DW 0 ;RESERVED, MUST BE 0
DW 40h ;Idle stack size
DW 0 ;RESERVED, MUST BE 0
DW 0 ;USER STACK SIZE
DD 0 ;RESERVED, MUST BE 0
DW 120 ;USER TASK COUNT
DW 0 ;RESERVED, MUST BE 0
DD 0 ;TXRDY DRIVER ROUTINE ADDRESS
DD create ; TCREATE ROUTINE
DD 0 ;NO TDELETE ROUTINE
DD 0 ;NO TSWITCH ROUTINE
DD 0 ;NO COMPONENT VECTOR TABLE
;
;
; create routine for making varible size stacks
;
create proc far
pushf
cli
push cx
push ax
push es
push bx
push ds
push di
mov bx,word ptr [di+16h];get stack seg of new stack
mov es,bx
mov bx,word ptr [di+18h];and ptr
mov cx,0
mov cl,byte ptr [di+9h] ;task id
push ds
push di
mov ax,dgroup
mov ds,ax
mov di,stacks
mov ax,stacks+2;get stack pointer for this task
mov ds,ax
add di,cx
add di,cx
add di,cx
add di,cx ;add 4 times the task id for the pointer
mov cx,word ptr [di+2];get stack seg
mov ax,word ptr [di] ;and ptr
pop di
pop ds
push cx
mov word ptr [di+16h],cx
sub ax,10h;room for stack frame
mov word ptr [di+18h],ax
mov di,ax
pop ds ;now new stack
mov ax,es:word ptr [bx+00h] ;get bp
mov word ptr [di+00h],ax ;save it in new stack
mov ax,es:word ptr [bx+02h] ;get bp
mov word ptr [di+02h],ax ;save it in new stack
mov ax,es:word ptr [bx+04h] ;get bp
mov word ptr [di+04h],ax ;save it in new stack
mov ax,es:word ptr [bx+06h] ;get bp
mov word ptr [di+06h],ax ;save it in new stack
mov ax,es:word ptr [bx+08h] ;get bp
mov word ptr [di+08h],ax ;save it in new stack
mov ax,es:word ptr [bx+0Ah] ;get bp
mov word ptr [di+0Ah],ax ;save it in new stack
mov ax,es:word ptr [bx+0Ch] ;get bp
mov word ptr [di+0Ch],ax ;save it in new stack
mov ax,es:word ptr [bx+0eh] ;get flags
mov word ptr [di+0eh],ax ;save it in new stack
pop di
pop ds
pop bx
pop es
pop ax
pop cx
popf
ret
create endp
INT05_VCT EQU WORD PTR 08H * 4 ;TIMER INTERRUPT
INTFE equ 03f8H
;
TIMER_INIT PROC NEAR
pushf
cli
xor ax,ax
mov ds,ax
mov ax,ds:[INT05_VCT]
mov ds:[INTFE],ax
mov ax,ds:[INT05_VCT+2]
mov ds:[INTFE + 2],ax
MOV AX, OFFSET CLOCK ;GET CLOCK INT
mov ds:[INT05_VCT],ax ;set up vector
MOV AX, SEG CLOCK ;GET CLOCK INT HANDLER (CS)
mov ds:[INT05_VCT+2],ax ;hi order too
MOV AX, OFFSET CLOCK ;GET CLOCK INT
;HANDLER (IP)
popf
RET ;RETURN TO INIT ROUTINE
TIMER_INIT ENDP
CLOCK PROC FAR
; ENTER SYSTEM MODE
;
int 0FEH ;call normal clock stuff
push ds
push ax
mov ax,data
mov ds,ax
mov ax,relclock
add ax,549
mov relclock,ax
mov ax,diskio
or ax,ax
pop ax
pop ds
jz keepgoing
iret
keepgoing:
PUSH AX ;SAVE AX
PUSH DX
push ds
MOV AX, 16H ;UI_ENTER
INT 81H ;CALL VRTX
tickit: mov ax,data
mov ds,ax
mov ax,relclock
cmp ax,100
jl nomoretick
sub ax,100
mov relclock,ax
MOV AX, 12H ;UI_TIMER
INT 81H ;CALL VRTX
jmp tickit
nomoretick:
;
nopending:
pop ds
pop dx
; EXIT SYSTEM MODE
MOV AX, 11H ;UI_EXIT
INT 81H ;CALL VRTX
;
clock endp
;
; Come here to abort
;
ABORT: ; print error message
A1: MOV al,'A'
mov dx,0
CLI
HLT
CXINIT ENDP
_PROG ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
public constart
constart proc far
constart endp
code ends
CONST SEGMENT PUBLIC 'CONST'
CONST ENDS
OLDPROG SEGMENT BYTE
DW 0CACAH
OLDPROG ENDS
;
; The data segment defines locations which contain the offsets
; of the base and top of the stack.
;
DATA SEGMENT PARA PUBLIC 'DATA'
EXTRN _STACK:WORD
PUBLIC _VER,_TOP,_BASE,_INAME,_ONAME,_PSP,_MBASE,_MNEXT,_MSIZE
PUBLIC _ENV,_DOS,_TSIZE,_ESIZE,_SS,_SP,_oserr,_fperr
PUBLIC cputype,_MODEL,_SIGFPE,_ndp,_fpa,_ndpsw,_ndpcw;
public _psize,_mused,_fbsize,_pbox,_p2box,disptype,stacks
_MODEL DW 3
_VER DB "LC 3.00"
_DOS DB 0 ; DOS major version number
DB 0 ; DOS minor version number
_SS DW 0 ; stack segment number
_SP DW 0 ; SP reset value
_TOP DW 0 ; top of stack (relative to SS)
_BASE DW 0 ; base of stack (relative to DS)
_INAME DB 2 DUP(0) ; input file name
_ONAME DB 2 DUP(0) ; output file name
_PSP DW 0 ; program segment prefix pointer
DW 0
_MBASE DW 0 ; base of memory pool
DW 0
_MNEXT DW 0 ; next available memory location
DW 0
_MSIZE DW 0 ; number of bytes left in pool
DW 0
_TSIZE DW 0 ; total size in paragraphs
_ENV DW 0 ; pointer to environment
DW 0
_ESIZE DW 0 ; environment size in bytes
_oserr dw 0 ; for _brk
_fperr dw 0 ; floating point error code
_fpa dq 0 ; floating point acc.
_ndp db 0 ;non-zero if 8087 in
_ndpsw dw 0ffffh ; 8087 status word
_ndpcw dw 0 ; 8087 control word
_SIGFPE DD 0 ;FLOAT POINT ERROR
_fbsize dw 0,0
_mused dw 0,0
_psize dw 0,0
cputype dw 0 ; 0= prolog 8088, 1 = cubit 186, 2 for ibm
disptype dw 0 ; b000h for mon or b800h for graphics
tock db 0 ;for clock
stacks dw 0,0 ;pointer to stacks pointers
_pbox dw 0,0
_p2box dw 0,0
public macrokey,diskio,relclock,useconsolekey
useconsolekey db 0,0 ;if 1, then we look for consolekey for keys, rather than pole ourselves
diskio dw 0
relclock dw 0
macrokey dw 0,0
buffsize equ 144 ;size of input buffer
boffset dw 0
dw 0
dw 0
dw 0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0
topoint dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;+1 main terminals
frpoint dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
csflag db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;ctrl s flag for pause
type2 db 1
typind2 db -1
busywin2 dw 0
DATA ENDS
;
UDATA SEGMENT PUBLIC 'DATA'
UDATA ENDS
;
; The stack segment is included to prevent the warning from the
; linker, and also to define the base (lowest address) of the stack.
;
STKRSV EQU 2 ; reserved stack size
XSTACK SEGMENT STACK 'DATA'
SBASE DB STKRSV DUP (?)
XSTACK ENDS
END CXINIT
uj5u.com熱心網友回復:
這一段匯編是運行在C程式 main 函式之前的。很古老的程式,需要維護。我想先轉到BC上,再慢慢移植到VC上。
uj5u.com熱心網友回復:
已經自己解決了。。。uj5u.com熱心網友回復:
code段里加個assume cs: code即可uj5u.com熱心網友回復:
就是說我花了兩千塊買的就只有這一行代碼啊
uj5u.com熱心網友回復:
CODE SEGMENT PARA PUBLIC 'CODE'public constart
constart proc far
constart endp
CODE ends
是加在這個里面嗎?在第二行嗎?
uj5u.com熱心網友回復:
CODE SEGMENT PARA PUBLIC 'CODE'assume cs: code
; ...
uj5u.com熱心網友回復:
編譯成功,運行出現 divide error 是什么原因呢可以加你QQ好友嗎?34510687
uj5u.com熱心網友回復:
DB 0EBH,03EH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH這些實際上是指令,不全的話沒法正常運行
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/128790.html
標籤:匯編語言
