Assembly 程序集x86命令行参数
我正在尝试用x86编写一个简单的程序(使用MASM进行编译)。 它的目的是将命令行参数写入输出(每一个都在一个新行中)。 以下是我到目前为止的想法:Assembly 程序集x86命令行参数,assembly,x86,command-line-arguments,masm,Assembly,X86,Command Line Arguments,Masm,我正在尝试用x86编写一个简单的程序(使用MASM进行编译)。 它的目的是将命令行参数写入输出(每一个都在一个新行中)。 以下是我到目前为止的想法: data1 segment input db 40 dup (?) ;input data1 ends code1 segment START: mov ax,seg input mov ds,ax mov dx,off
data1 segment
input db 40 dup (?) ;input
data1 ends
code1 segment
START:
mov ax,seg input
mov ds,ax
mov dx,offset input
mov di, dx
mov si, 82h
mov cl,es:[80h]
word:
mov al,es:[si]
mov ds:[di],al
inc si
inc di
cmp al,0Dh ;out of arguments? (if YES goto finish)
jz finish
cmp al,20h ;end of word? (if NO goto word)
jnz word
mov al, '$' ;line terminate
mov ds:[di], al
mov ah,09h ;write string
int 21h
xor di,di ;prepare registry for new word
call new_line
loop word
finish:
mov al, '$'
mov ds:[di], al
mov ah,09h ;write last argument
int 21h
mov ax,4ch ;end program
int 21h
new_line:
push ax
push bp
mov ax,0e0ah ;ah=0e-write char,al=0a-go to new line
int 10h
mov al,13 ;carriage return
int 10h
pop bp
pop ax
ret
code1 ends
end START
在emu8086下测试时,它似乎工作得很好,但在使用MASM编译后,它只在10%的执行中给出正确的结果。
在开始复制参数字符串之前,非常感谢您提供的任何帮助,请执行以下操作:
mov dx,offset input
mov di, dx
但如果有多个参数,则在打印第一个参数后执行此操作:
xor di,di ;prepare registry for new word
这可能应该是
movdi,dx
,除非你绝对肯定地100%确定输入的偏移量总是0。我很久没有看任何汇编程序了……大提示而不是,这是你的答案
由于您没有初始化ES,您确定ES已加载相应的段吗
注意,通过加载包含80H内容的CL,可以将CL设置为命令行的长度
当您循环回WORD(顺便说一句,这不是标签的好名称,因为它是一个关键字)时,您正在传输下一个字节。所有这些都很好,但您并没有减少CL,即命令行中的字符数。您应该跳转到循环指令,该指令递减CX,如果未达到0,则返回到目标标签
在执行int10h
之前,您已经非常仔细(正确)地保存了BP和AX,保存这两个寄存器是否足够?也许其他寄存器也被修改了
类似地,INT 21H
-是否有任何寄存器可以通过执行该中断后的例程进行更改?如果是这样,您应该先推
它们,然后在例程完成后弹出
它们
非常谨慎地依靠CR=0DH=13来结束生产线。如果用于参数的可用空间已完全填满,则将缺少此选项。CL中的字符计数更为重要。如果您使用循环
指令正确地减少CL,您将不会计数器CR(IIRC),因为它不构成计数的一部分。当然,这假设CX
不会因为所有folderol检查空格或写出行而改变
哦,顺便说一句,按照惯例,新行的顺序是CR
,LF
或0DH,0AH。在机械终端上,这实际上是将打印头移回左侧,然后将纸张向上滚动一行。打印头非常坚固,当它们靠着弹簧挡块返回时,会聚集大量的动量。其结果是,它们经常会反弹,当打印头固定时,下一行的开头字符会喷洒在打印输出的前几列上,每一行都不可避免地使机械装置越来越不适应。事实上,有一个换行符be CR LF CR并不罕见,只是为了让力学时间稳定下来。您的程序没有堆栈段,也不必仅基于此工作。您的程序也不能正确终止。