2016-04-20 8 views
1

Während ich versuche, ein voll funktionierendes (debugged) Beispiel für this question zu liefern, kann ich den zusammengesetzten Code nicht verstehen. Ich bin ein bisschen eingerostet mit der guten alten DOS + TASM-Kombination.mov al, Byte [si + bx] wird mov al, [bx + si + 1]

Das ist mein asm-Code (print.asm):

.MODEL SMALL 
.STACK 64 
.DATA 
    string DB 'Something' 
    len equ $-string 

.CODE 

Entry: 
    mov ax, @data ;make DS point to our DATA segment 
    mov ds, ax 

    xor bx, bx  
    mov si, offset string 

Char: 
    mov al, byte[si + bx] 
    mov ah, 2 
    mov dl, al 
    int 21h 

    inc bx 
    cmp bx, len 
    jnz Char 

Fin: 
    mov ax, 4c00h 
    int 21h 

END Entry 

ich zusammenbauen mit

tasm print.asm 
tlink print.obj 

in den 16-Bit-ausführbaren print.exe führen.

Bei der Prüfung, ich bin überrascht, dass die Programmausgänge

omething 

Als ich an dem zusammengesetzten Objekt aussehen, kann ich sehen:

_TEXT:0000 start: 
_TEXT:0000     mov  ax, seg DGROUP 
_TEXT:0003     mov  ds, ax 
_TEXT:0005     xor  bx, bx 
_TEXT:0007     mov  si, offset unk_10030 
_TEXT:000A 
_TEXT:000A loc_1001A:        ; CODE XREF: _TEXT:0017j 
_TEXT:000A     mov  al, [bx+si+1] ; <== I do not understand the '+1' 
_TEXT:000D     mov  ah, 2 
_TEXT:000F     mov  dl, al 
_TEXT:0011     int  21h    ; DOS - DISPLAY OUTPUT 
_TEXT:0011           ; DL = character to send to standard output 
_TEXT:0013     inc  bx 
_TEXT:0014     cmp  bx, 9 
_TEXT:0017     jnz  short loc_1001A 
_TEXT:0019     mov  ax, 4C00h 
_TEXT:001C     int  21h    ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT) 
_TEXT:001C           ; AL = exit code 

und ich bin verwirrt mit dem erzeugten mov al, [bx+si+1] von meiner mov al, byte[si + bx], die 1 Byte vom Anfang der Zeichenfolge zeigt.

+0

Ich nehme an, das 'Byte' ist' 1' (dh. Größe eines Bytes) und einige Assembler erlauben Offsets außerhalb der Klammern (so dass es Arrayindexierung ähnelt). "al" bedeutet bereits "byte", also muss man das nicht schreiben, aber wenn du willst, sollte es wahrscheinlich "byte ptr" sein. – Jester

+0

@Jester: Durch das Entfernen des 'Bytes' wurde der" Fehler "behoben. Ich dachte immer, dass 'Byte'' Wort' und al, wenn Speicher ausgewertet wurde, Ratschläge für Assembler verwendet wurden, um die richtigen Opcodes zu verwenden, und nicht in Offset-Berechnungen verwendet wurden. Obwohl es öfter 'byte ptr' war. – Seki

+0

Vielleicht möchten Sie den Ideal-Modus von TASM verwenden. Es interpretiert BYTE als 1, um mit MASM 5 kompatibel zu sein. Im idealen Modus würde es einen Fehler geben. Sie hätten jedoch viel Code umgeschrieben, so ziemlich alle Anweisungen. –

Antwort

7

byte[si + bx] ist NASM-Syntax. In TASM-Syntax entspricht das [si + bx + byte], was gleich [si + bx + 1] ist.

Im TASM Handbuch im Abschnitt „Ausdrücke“ Sie haben eine Tabelle mit dem Namen „Standard Symbolwerte“ bekam, wo Sie, dass das Symbol „BYTE“ sehen entspricht dem Wert 1.

Was Sie wollen, ist byte ptr [si + bx]. Oder Sie können einfach [si + bx] in diesem Fall verwenden, da es keine Zweideutigkeit gibt (weil die Größe von al dem Assembler bekannt ist).

+0

Ich habe das Tasm 5 Handbuch. Danke für diesen Zeiger und für die Disambiguierung mit der üblichen nasm-Syntax. – Seki