汇编程序可以解释部分代码

时间:2012-12-16 17:40:31

标签: assembly x86 tasm

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

   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”,或者我错了? 如果我是对的,例如它可以是什么?

如果有人能够详细解释这段代码,那就太好了。

P.S。使用Assembler Tasm

1 个答案:

答案 0 :(得分: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 +充其量。如果你的导师给你这个,请解雇他! :)