也许有人可以解释这段代码是什么:
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
答案 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 +充其量。如果你的导师给你这个,请解雇他! :)