0

我正在尝试在 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% 的执行中给出正确的结果。任何帮助将非常感激

4

2 回答 2

1

我已经很久没有看过任何汇编程序了......大提示而不是here's your answer

你确定 ES 加载了适当的段,因为你没有初始化它?

请注意,通过使用 80H 的内容加载 CL,您可以将 CL 设置为命令行的 LENGTH。

当您循环回到 WORD (不是一个好名称的标签,顺便说一句 - 因为它是一个关键字),您正在传输下一个字节。一切都很好 - 但你没有减少 CL,命令行中的字符数。如果未达到 0,您应该跳转到递减 CX 并返回目标标签的 LOOP 指令。

在执行INT 10h保存这两个寄存器是否足够?也许其他寄存器也被修改了......

同样,INT 21H- 是否有任何寄存器可以通过执行此中断后面的例程而改变?如果是这样,您应该PUSHPOP处理它们,然后在例程完成后将它们返回。

依靠 CR=0DH=13 结束行时要非常小心。如果参数的可用空间被完全填满,这将丢失。CL 中的字符数更为重要。如果您使用该LOOP指令正确递减 CL,您将不会遇到 CR (IIRC),因为它不构成计数的一部分。当然,这假设CX所有文件夹都没有更改检查空格或写出行...

哦,顺便说一句 - 按照惯例,新行是CR,LF或 0DH,0AH - 按此顺序。在机械终端上,这实际上是将打印头移回左侧,然后将纸张向上滚动一行。打印头非常坚固,当它们靠着弹簧加载的挡块返回时聚集了大量的动力。结果是它们经常跳动,并且随着打印头的稳定,下一行的开始字符会喷到打印输出的前几列上,每条新行都会无情地使机制越来越无法调整。事实上,换行是 CR LF CR 并不罕见,只是为了让机制有时间解决。

于 2013-04-04T12:40:35.787 回答
0

在开始复制参数字符串之前,您需要执行以下操作:

mov dx,offset input
mov di, dx

但是,如果有多个参数,则在打印第一个参数后执行此操作:

xor di,di    ;prepare registry for new word

mov di, dx除非您绝对、肯定地 100% 确定inputalways 的偏移量为 0 ,否则这可能应该是这样。

于 2013-04-04T11:23:54.873 回答