2016-05-14 16 views
1

Ich versuche zu lernen, wie ich meine Ausgabe in Assembly schreiben Ich habe diesen Code getrennt von dem ursprünglichen Code nur für diesen Zweck Ich plane, dies nach erfolgreich implementieren record etw ... bitte helfen! danke Ihnen allen Fortschritt inAssembly: initializer Magnitude zu groß für die angegebene Größe

Es paar Fehler in diesem Code sind aber zunächst möchte ich den Grund für den Fehler A2071 wissen: initializer Größe zu groß für bestimmte Größe (Linie 10)

TITLE PHW05 (s151619hw05.asm) 
; 

INCLUDE Irvine32.inc 

.data 

startmessage db "Start$" 
msg db "display this message$" 
FileName db "abcd.txt" 
handle dw ? 

.code 
main PROC 

mov ax, @data 
mov ds, ax 
mov dx,offset startmessage 
mov ah, 09h 
int 21h 

mov dx,offset Filename 
xor cx,cx 
mov ah, 3ch 
int 21h 

mov dx, offset filename 
mov al,2 
mov ah,3dh 
int 21h 

mov handle, ax 

mov dx,offset msg 
mov bx,handle 
mov cx,21 
mov ah,40h 
int 21h 

mov bx,handle 
mov ah,3eh 
int 21h 


;lea dx, offset msg 
;mov ah, 40h 
;mov cx,20 
;int 21h 


exit 

main ENDP 

END main 

Update : ich versuchte, Linie 10 von Filename db „s151619.txt“ zu Filename db „s151619.txt“ zu ändern, 0 und den Fehler A2071: initializer Größe zu groß für bestimmte Größe auf der Linie erschien 11 jetzt. ..

+1

Vom 'assembly' Tag Info: * Geben Sie auch den Prozessor oder den Befehlssatz an, auf den sich Ihre Frage bezieht, sowie w Hat Assembler Sie verwenden. * –

+3

Sie scheinen eine Mischung aus 16-Bit-Code (DOS-Interrupt 21h) und 32-Bit-MASM mit Irvine-Bibliothek zu schreiben. Also schreiben Sie 16-Bit-DOS-Anwendungen oder 32-Bit-Windows-Anwendungen? –

Antwort

3

Sie schließen Irvine32.inc ein, aber verwenden Sie es nicht. So entfernen Sie reinen 16-Bit-Code zu bekommen, weil Irvine32.inc selbst SmallWin.inc enthält, die folgenden Setup-Richtlinien enthält:

.686P  ; Pentium Pro or later 
.MODEL flat, stdcall 

gesetzt Diese den Modus auf Pentium Pro Anweisungen mit einem 32-Bit-FLAT Modell. Um zum Beispiel des Registers 16-Bit-Einstellung AX auf einen 32-Bit-Datensegmentwert mit

mov ax, @data`  ; 32-bit value to 16-bit register --- Don't work 

würden Sie einen Fehler wie diese

Fehler A2048: 2: Operanden gleich groß sein müssen - 4

und einige mehr auf andere Anweisungen im 32-Bit-Modus.

Ihr Problem in Zeile 11 tritt aufgrund eines Namenskonflikts zwischen "Handle" in und "HANDLE" in HANDLE TEXTEQU <DWORD> von SmallWin.inc. Bei der Montage wird Ihre Variablendefinition mit

ausgewertet, was ungültig ist und Ihnen den Fehler gibt.

Lösung:

  • entfernen INCLUDE Irvine32.inc
  • Ersetzen Sie es mit .MODEL SMALL, STDCALL - Einstellung 16-Bit-Modus
  • Ersetzen exit mit dem DOS-Exit-Aufruf mov ax,4C00h int 21h