2016-03-31 6 views
-1

Ich habe diese Versammlung Funktion zu schreiben, die von pollcount_putc (char) genannt wirdZählen pollcount mit COM2 THRE mit x86 Assembly

Es ein Zeichen nimmt, zählt, wie viele Tests von COM2 THRE werden in der Abfrageschleife durchgeführt und dann gibt es an COM2 aus. Im Moment mache ich etwas falsches, da ich alle 0s empfange. Hier

ist der Code unter:

#Function call is pollcount_putc(c[i]) 
#COM2 base address is 0x2f8 
.text 
.globl _pollcount_putc 
COMTWO = 0x2f8 

_pollcount_putc: 

    movl 4(%esp), %ecx #get character 
    movl $COMTWO, %edx #set port address 
    addl $5, %edx #get to LSR 
    movl $0, %ebx #set counter to 0 

loop: 
    inb (%dx), %al #read in LSR byte 
    andb $0x01, %al #isolate DR bit 
    jz loop #if zero or not ready loop until 
    movw $COMTWO, %dx #Reset dx with correct com address 

comaddress: 
    movb %cl, %al #move char input to output 
    outb %al, (%dx) #output the char taken in 
    addl $5, %edx #move back to LSR byte 
countloop: 
    incl %ebx #increment count 
    inb (%dx), %al #read from LSR byte to get thre 
    andb $0x20, %al #mask to look at thre 
    jz countloop #if tx hr empty 
end: 
    movl %ebx, %eax #set counter to eax return register 
    ret 
    .end 

Wenn jemand eine Idee hat, wo meine Logik Probleme, die sind groß sein würde. Ich bin mir nicht sicher, ob ich das überhaupt richtig mache.

Update: Ich habe das funktioniert und oben ist der neue Code. In ein paar Tagen werde ich die Antwort auch unten posten, um es zu schließen.

+1

90% des Geheimnisses des Schreibens von anständigem Assemblercode ist, einen guten Kommentar zu * jeder * Aussage zu geben. Und nicht "zurückgesetzt", sondern eine logische Beschreibung dessen, was es tut. Du hörst auf, an genau dem Punkt zu kommentieren, an dem du hoffnungslos verloren gegangen bist. Wenn Sie keinen Kommentar schreiben können, dann können Sie unweigerlich keinen korrekten Code schreiben. Oder hol dir Hilfe, da niemand sehen kann, was du denkst. –

+0

Ich werde den aktualisierten Code veröffentlichen, der funktioniert .... mit Kommentaren. Obwohl Sie nicht falsch lagen, war Ihr Kommentar auch nicht hilfreich. – Peter3

Antwort

-1

Hat Ihr c [i] 4 Bytes? Wenn nicht, sollten Sie nicht 4 (% esp) verwenden, um seinen Speicherort zu erhalten.

+0

Dieser Teil ist tatsächlich korrekt. Der Stack-Pointer verbraucht 4 Bytes an Information und dann würde das Zeichen übergeben, es wäre der nächste, also würde ich 4 zum Stack-Pointer hinzufügen und dann den Inhalt davon holen. – Peter3

Verwandte Themen