Assembly 在本代码中比较CMP AL,1的目的是什么?
我仍然无法找到,在(CMP AL,1)指令中将AL与“1”进行比较的目的是什么?我已经通过了查哈德的程序,但仍然无法理解 我正在做一个关于MS DOS编程的项目Assembly 在本代码中比较CMP AL,1的目的是什么?,assembly,x86,Assembly,X86,我仍然无法找到,在(CMP AL,1)指令中将AL与“1”进行比较的目的是什么?我已经通过了查哈德的程序,但仍然无法理解 我正在做一个关于MS DOS编程的项目 SUBTTL IOFUNC -- DO FUNCTION 1-12 I/O PAGE IOFUNC_RETRY: ASSUME DS:NOTHING,ES:NOTHING invoke restore_world procedure IOFUNC,NEAR ASSUME
SUBTTL IOFUNC -- DO FUNCTION 1-12 I/O
PAGE
IOFUNC_RETRY:
ASSUME DS:NOTHING,ES:NOTHING
invoke restore_world
procedure IOFUNC,NEAR
ASSUME DS:NOTHING,ES:NOTHING
; Inputs:
; DS:SI Points to FCB
; AH is function code
; = 0 Input
; = 1 Input Status
; = 2 Output
; = 3 Output Status
; = 4 Flush
; AL = character if output
; Function:
; Perform indicated I/O to device or file
; Outputs:
; AL is character if input
; If a status call
; zero set if not ready
; zero reset if ready (character in AL for input status)
; For regular files:
; Input Status
; Gets character but restores fcb_RR field
; Zero set on EOF
; Input
; Gets character advances fcb_RR field
; Returns ^Z on EOF
; Output Status
; Always ready
; AX altered, all other registers preserved
MOV WORD PTR [IOXAD+2],SS
MOV WORD PTR [IOXAD],OFFSET DOSGROUP:DEVIOBUF
MOV WORD PTR [IOSCNT],1
MOV WORD PTR [DEVIOBUF],AX
IOFUNC2:
TEST [SI.fcb_DEVID],080H
JNZ IOTODEV
JMP IOTOFILE
IOTODEV:
invoke save_world
PUSH DS
PUSH SS
POP ES
PUSH SS
POP DS
ASSUME DS:DOSGROUP
XOR BX,BX
MOV [IOCALL.REQSTAT],BX
MOV BYTE PTR [IOMED],BL
MOV BX,OFFSET DOSGROUP:IOCALL
MOV CX,(DEVRD SHL 8) OR DRDWRHL
OR AH,AH
JZ DCALLR
MOV CX,(DEVRDND SHL 8) OR DRDNDHL
DEC AH
JZ DCALLR
MOV CX,(DEVWRT SHL 8) OR DRDWRHL
DEC AH
JZ DCALLO
MOV CX,(DEVOST SHL 8) OR DSTATHL
DEC AH
JZ DCALLO
DFLUSH:
MOV CX,(DEVIFL SHL 8) OR DFLSHL
DCALLR:
MOV AH,86H
DCALL:
MOV [IOCALL.REQLEN],CL
MOV [IOCALL.REQFUNC],CH
MOV CL,AH
POP DS
ASSUME DS:NOTHING
CALL DEVIOCALL
MOV DI,[IOCALL.REQSTAT]
TEST DI,STERR
JZ OKDEVIO
MOV AH,CL
invoke CHARHARD
CMP AL,1 // **this is my trouble**
JZ IOFUNC_RETRY
;Know user must have wanted ignore. Make sure device shows ready so
;that DOS doesn't get caught in a status loop when user simply wants
;to ignore the error.
AND BYTE PTR [IOCALL.REQSTAT+1], NOT (STBUI SHR 8)
OKDEVIO: continues.........
以下是致命代码:
SUBTTL CHARHRD,HARDERR,ERROR -- HANDLE DISK
ERRORS AND RETURN TO USER
PAGE
procedure CHARHARD,NEAR
ASSUME DS:NOTHING,ES:NOTHING,SS:DOSGROUP
; Character device error handler
; Same function as HARDERR
MOV WORD PTR [EXITHOLD+2],ES
MOV WORD PTR [EXITHOLD],BP
PUSH SI
AND DI,STECODE
MOV BP,DS ;Device pointer is BP:SI
CALL FATALC
POP SI
return
CHARHARD ENDP
假设宏“invoke”并不奇怪,它有效地检查了FATALC的返回值;因此,如果FATALC返回时AL等于1,它将调用IOFUNC\u RETRY,否则它将继续执行其他奇怪的代码
如果你不介意我问:现在是2018年。你为什么要学习用MS-DOS编程?您是否参与了时间旅行?可能会在
al
中返回一个状态代码,表明这是否是可重试的错误(因为jz IOFUNC_RETRY
)。它可能由FATALC
或其某个子例程设置。你没有显示代码。这越来越近了。注意它是如何执行的INT-INT\u-fatal\u-abort
(又称INT-24h
)。如果您查阅文档,您会发现实际上返回了一个状态代码。您阅读了注释吗?他们解释了为什么会发生这种比较。亲爱的,我同意这是旧代码,但我参与了一个有关MSDOS源代码编程的项目。以便我们了解设备/文件输入/输出的基本编程。
FATALC:
CMP BYTE PTR [ERRORMODE],0
JNZ SETIGN ; No INT 24s if already INT 24
MOV [CONTSTK],SP
PUSH SS
POP ES
ASSUME ES:DOSGROUP
CLI ; Prepare to play with stack
INC BYTE PTR [ERRORMODE] ; Flag INT 24 in.
progress
DEC BYTE PTR [INDOS] ; INT 24 handler might.
not return
MOV SS,[user_SS]
ASSUME SS:NOTHING
MOV SP,ES:[user_SP] ; User stack pointer.
restored
INT int_fatal_abort ; Fatal error interrupt vector,
must preserve ES
MOV ES:[user_SP],SP ; restore our stack
MOV ES:[user_SS],SS
MOV SP,ES
MOV SS,SP
ASSUME SS:DOSGROUP
MOV SP,[CONTSTK]
INC BYTE PTR [INDOS] ; Back in the DOS
MOV BYTE PTR [ERRORMODE],0 ; Back from INT 24
STI