2013-04-04 165 views
1

我想在x86中编写一个简单的程序(使用MASM编译)。 它的目的是编写命令行参数输出(每个都在一个新行中)。 这是我想出了迄今:汇编x86命令行参数

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%给予正确的结果很好地工作。 任何帮助,将不胜感激

+0

你的程序没有堆栈段,不必以此为基础工作。您的程序也不能正确终止。 – 2013-04-05 03:26:56

回答

1

你开始复制参数字符串之前,你这样做:

mov dx,offset input 
mov di, dx 

但如果有一个以上的参数,你这样做的第一个参数后已打印:

xor di,di ;prepare registry for new word 

这应该可能是mov di, dx,除非您绝对肯定地100%确定input的偏移始终为0.

2

这是这么久以来我看着任何汇编...大提示,而不是here's your answer

你肯定ES加载相应的段,因为你没有初始化呢?

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

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

在执行INT 10h之前,您已经非常仔细地(正确)保存了BP和AX是否将这两个寄存器保存了足够的空间?也许其他寄存器也被修改...

类似地,INT 21H - 是否有任何寄存器可以通过执行该中断后面的例程来更改?如果是这样,你应该先PUSH他们第一个和POP他们回来后,例程结束。

对于依靠CR = 0DH = 13来结束这条线非常ca ca。如果参数的可用空间是完全填充的,这将会丢失。 CL中的字符数更重要。如果你使用LOOP指令正确地减少了CL,那么你就不会计数CR(IIRC),因为它不构成计数的一部分。它假定,当然,CX不是所有的胡闹检查空间或写出线的改变......

哦,顺便说一句 - 通常,一个新的生产线是CRLF或0DH, 0AH - 按此顺序。在机械终端上,这实际上是将打印头移回到左侧,然后将纸张向上滚动一行。打印头非常坚固,并在弹簧加载挡块返回时产生大量动力。结果是他们经常反弹,并且随着打印头的安装,下一行的开始字符将喷印到打印输出的前几列上,每一条新线都无可避免地使机械装置越来越无法调整。事实上,换行是CR LF CR并不罕见,只是为了让机械师有时间来解决。