Ich habe derzeit eine Aufgabe, wo ich in Assemblersprache programmieren muss, wo Sie Benutzereingabe nehmen, um einen 4-stelligen hexadezimalen Wert zu erhalten und in binär zu konvertieren und dann, nachdem Sie den Binärwert erhalten haben wandeln Sie es in einen Monat Tag und Jahr um, wobei die ersten 7 Ziffern das Jahr sind, die nächsten vier sind der Monat und die letzten 5 sind der Tag.Assembly Language Shift in Carry Flags
Ich habe alles in Binär umgewandelt und habe eine Idee, wie man es von binären in normale ganzzahlige Werte für Jahr, Monat und Tag bekommt. Wenn ich meinen Code ausführe, ist die Ausgabe 0/0/0
. Ich bin mir nicht sicher, ob es dort ist, wo ich meine Verschiebung oder etwas anderes vermasselt habe. Kannst du einen Blick darauf werfen und mir eine Eingabe geben, wo du korrigieren sollst? In dem Code, den ich anlege, stelle ich nur calcYear auf und rechne damit, dass ich das herausfinden kann und arbeite dann an dem Rest von dort.
Mein Code:
firstLine:
call crlf
mov si, offset programOne
mov cx, programOneLen
call putStrng ;displays 'Program by Joe Remaklus'
call crlf
call crlf
call inputVal ;prompt for hex input
call putBin ;display the value in AX as binary
call crlf
call calcYear ;display the year of the first 7 binary digits.
mov si, offset slash
mov cx, slashLen
call putStrng
call calcMonth ;display the month of the next 4 binary digits.
mov si, offset slash
mov cx, slashLen
call putStrng
call calcDay ;display the day of the next 5 binary digits.
call crlf
call inputVal
call putBin
mov ah,04c
int 021
prompt db 'Enter a 4-digit hex value'
lenPrompt = $-prompt
inputVal:
push si, cx
mov si, offset prompt
mov cx, lenPrompt
call putStrng
call crlf
call getHex
call crlf
pop cx, si
ret
;---------------------------------------------------------------
putBin:
push ax, cx, dx
mov cx, 16 ;number of bits to display
putBinLoopTop:
mov dl, '0' ;assume bit to display is zero
shl ax, 1 ;shift bit to display into Carry Flag
jnc putBinSkipInc ;if the top bit was zero skip the inc
inc dl ;else inc DL to '1'
putBinSkipInc:
call putChar ;display the character in DL
loop putBinLoopTop ;continue until 16 bits are displayed
pop dx, cx, ax
ret
;---------------------------------------------------------------
calcYear:
mov year, 0
mov si, 0
shl ax, 1
adc si, 0
iMul onetwoeight
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul sixfour
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul threetwo
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul sixteen
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul eight
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul four
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul two
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul one
add year, si
mov si, year
add si, 1980
call putPos
ret
Haben Sie dies in einem Debugger in einem Schritt ausgeführt, um sicherzustellen, dass Werte in Regs Ihren Erwartungen entsprechen? Du hast Recht, dass 'shl ax' /' adc si, 0' gleichbedeutend damit ist, ein bisschen in ax zu testen und dann 'setcc' zu verwenden. (z. B. 'xor dx, dx' /' bt ax, 3'/'setc dl', außer dass dies' ax' nicht ändert) Ich bin überhaupt nicht überzeugt, dass Ihre 'imul's sinnvoll sind. Vielleicht ist es eine wirklich runde Sache, etwas zu tun, aber ich habe nicht herausgefunden, was. Sie wissen, dass das Multiplizieren mit Potenzen von 2 das Gleiche wie das Verschieben ist, oder? Außerdem könnten Sie 'year' in' si' die ganze Zeit behalten, anstatt ständig ein Speicherziel zu verwenden. –
downvoted für das Fehlen von Kommentaren im Code oder die Beschreibung von welchem Algorithmus genau das Jahr calc soll implementiert werden. Es sieht aus wie eine Art von seltsamen Hinzufügen der Bits zu mir (popcnt). Auch wenn Sie kein minimales Beispiel haben, das nur das Problem zeigt, das Sie haben. Das ist immer noch viel Code. Wenn du die Frage verbesserst, hinterlasse eine Antwort und entferne meinen Downvote. –
Nein. Verwenden Sie einen Debugger, um festzustellen, wo Ihr Code falsch läuft, und wenn Sie nicht sehen können, warum dieses bestimmte Verhalten auftritt, fragen Sie erneut nach etwas genauerem als "... Eingabe auf, wo zu korrigieren." –