Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在本代码中比较CMP AL,1的目的是什么?_Assembly_X86 - Fatal编程技术网

Assembly 在本代码中比较CMP AL,1的目的是什么?

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

我仍然无法找到,在(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  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