2016-04-18 9 views
2

Ich las Buch Kip IRVINE Assembly Language for x86 Processors und er schrieb:Führende Null in Zeichenerweiterung in x86-Assembly?

zu größeren kleineren Werten Kopieren

Obwohl MOV Daten von einem kleineren Operanden zu einem größeren nicht direkt kann man kopieren, Programmierer Abhilfen erstellen können. Angenommen, der Zähler (ohne Vorzeichen, 16 Bit) muss nach ECX (32 Bit) verschoben werden. Wir können ECX gesetzt Zählung CX auf Null und bewegen:

.data 
count WORD 1 
.code 
mov ecx,0 
mov cx,count 

Was passiert, wenn wir den gleichen Ansatz mit einer signierten ganzen Zahl gleich -16 versuchen?

.data 
signedVal SWORD -16 ; FFF0h (-16) 
.code 
mov ecx,0 
mov cx,signedVal ; ECX = 0000FFF0h (+65,520) 

Der Wert in ECX (+65.520) ist komplett anders als -16. Auf der anderen Seite, wenn wir gefüllte ECX erste mit FFFFFFFFh und dann signedVal zu CX kopiert, der endgültigen Wert wäre richtig gewesen waren: mit dem letzten Teil

mov ecx,0FFFFFFFFh 
mov cx,signedVal ; ECX = FFFFFFF0h (-16) 

Mein Problem ist. Ich denke, die erste Zeile im obigen Code sollte mov ecx,FFFFFFFFFh geschrieben haben, nicht 0FFFFFFFFh. Mit anderen Worten, was ist die führende Null?

+0

'mov ecx, -1' sollte auch funktionieren. –

Antwort

4

Um Etiketten und Zahlenliterale zu sagen auseinander meisten Monteure benötigen, um die letzteren zu immer mit einer Ziffer beginnen, auch wenn es nur eine nicht signifikante Null ist.

Wenn Sie die Anzahl der signifikanten Hexadezimalziffern in 0ffffffffh zählen, sehen Sie, dass es sich tatsächlich um acht handelt, die jeweils vier Informationsbits enthalten.
Und 8 mal 4 ist 32.
Ihr Literal fffffffffh ist stattdessen 36 Bit lang.

Einfach setzen Zahlen wie a7h, e0h und so weiter, muss mit einer führenden 0 geschrieben werden.
In Ihrem Kopf sollten Sie automatisch überflüssige Nullen loswerden.

+0

danke sehr gut, ich vermisse diesen Punkt – user3661613

0

Um zwischen Symbolen (d. H. Variablen) und Zahlen zu unterscheiden, müssen Sie Zahlen mit einer Dezimalziffer beginnen.

Der numerische Parameter für mov ecx wird immer als 32-Bit gespeichert, unabhängig von der Anzahl der Ziffern, die Sie in den Code schreiben (solange der endgültige Wert kleiner als 2^32 ist). Führende Nullen werden ignoriert.

Im Gegensatz zu C/C++ werden Zahlen, die mit 0 beginnen, nicht als Oktalzahlen interpretiert (wenn es Ihr Anliegen ist). Oktalzahlen beginnen mit 0t.

Verwandte Themen