Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 程序集x86命令行参数_Assembly_X86_Command Line Arguments_Masm - Fatal编程技术网

Assembly 程序集x86命令行参数

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

我正在尝试用x86编写一个简单的程序(使用MASM进行编译)。 它的目的是将命令行参数写入输出(每一个都在一个新行中)。 以下是我到目前为止的想法:

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并不罕见,只是为了让力学时间稳定下来。

您的程序没有堆栈段,也不必仅基于此工作。您的程序也不能正确终止。