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.
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
@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
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. –