0

也许有人可以解释这段代码是做什么的:

   MOV SI,80h     
    XOR DI,DI      
    MOV BL,[SI]    
    INC SI         

    MOV AH,9
    LEA DX,info     
    INT 21h

    OR BL,BL        
    JZ be_arg       

    INC SI
    JMP su_arg      

be_arg:     
    MOV AH,9
    LEA DX,input1
    INT 21h

...
su_arg:
    XOR DI,DI
vej:
    MOV AL,[SI]
    CMP SI,100h
    JZ vej_j

    CMP SI,100h
    JZ vej_j

    MOV [failas+DI],AL

    INC SI
    INC DI
    JMP short vej

vej_j:
    JMP input_juz

那里

    failas DB 80h DUP(0)

据我了解,可以在运行程序时读取一些可以编写的参数,然后它会转到“su_arg”,还是我错了?如果我是对的,例如它可以是什么?

如果有人可以详细解释此代码,那就太好了。

PS 使用汇编器 Tasm

4

1 回答 1

2

现在谁在乎 DOS 做了什么?好吧,你必须知道,才能理解这段代码。如果您以“myprog foo”启动程序,则“foo”是“命令行参数”。DOS 把它放在 PSP(程序段前缀)的后半部分。地址 [80h] 是命令行参数的总(字节)计数。代码的第一部分将此值放入bl. 然后你打印一些东西——我们不知道是什么,因为你没有给我们看!or bl, bl不会改变 中的值,bl它只是设置标志。如果该值为零,则跳转到可能打印“未给出命令行参数”等的部分。如图所示,它然后下降到su_arg:- 也许是...表示一些代码做一些更明智的事情。此时,您将 PSP 的整个剩余部分复制到位于failas. 我们有“计数” bl。我们还知道在命令行参数的末尾会有一个回车(十进制 13 或 0Dh)。您可能想用“$”覆盖 CR。能够用 int 21h/9 显示它。但是不,您复制了 PSP 的整个其余部分。也许这对你打算用它做的任何事情都没关系。相当可怕的代码 - 充其量是 C+。如果你的教练给了你这个,解雇他!:)

于 2012-12-16T20:48:59.153 回答