Frage zu db ...
-
msgCRLF db 0x0D, 0x0A, 0 msgProgress db "*", 0 msgLoading db "Loading Second Stage Bootloader", 0x0D, 0x0A, 0 msgFailure db 0x0D, 0x0A, "BOOT2.BIN MISSING", 0x0D, 0x0A, 0
Hier kam die Frage auf, ob man das zusammenfassen, also 0x0D, 0x0A, 0 durch msgCRLF ersetzen kann.
-
Um es kurz zu machen Nein!
Nun die längere Antwort. Was für einen Assembler benutzt du (ich vermute mal NASM)?
So wie du es geschrieben hast, müsste NASM dann meckern, weil er versuchen würde die Adresse von msgCRLF als byte einzutragen, was ja nicht funktionieren kann. Du kannst es aber machen, indem du msgCRLF als equ (oder auch als define) machst:
msgCRLF equ 0x0D, 0x0A
Das ist jetzt nicht getestet sollte aber so oder ähnlich funktionieren. Immer dran denken, wenn du etwas mit db oder sonstwas ähnlichem (dw, dd, resb, ...) definierst ist das wie als wenn du geschrieben hättest "label: db ..."! Du definierst also immer ein Label.
-
eventuell geht das:
%define msgCRLF 0x0D,0x0A ... msgFailure db msgCRLF,"BOOT2.BIN MISSING',msgCRLF,0
-
nanu, beschwert sich nasm gar nicht über Zeichensetzung "char' ?
in debug geht nur 'char' oder "char"ich verstehe zwar nicht wirklich, wie die Frage hier genau gemeint ist, aber
ich probier mal was mit fasmw:org 100h msgCRLF equ 0a0d00h mov edx, msgCRLF mov msgCRLF,esi int 20
...fasmw beschwert sich beim compilieren zu Recht über "mov msgCRLF,esi"...
jetzt machen wie mal mov msgCRLF, esi weg und gucken mit debug, was fasmw
compiliert hat:
..ach ne, debug sieht ja keine 32bit, also mit debug-clone debugx von paul
vojta gucken:mit dem befehl rx in den 32bit modus schalten:
-rx
386 regs on
-r
EAX=00000000 EBX=00000000 ECX=00000008 EDX=00000000 ESP=0000FFFE EBP=00000000
ESI=00000000 EDI=00000000 NV UP EI NG NZ NA PO NC
DS=1AB5 ES=1AB5 SS=1AB5 CS=1AB5 FS=0000 GS=0000 EIP=00000100
1AB5:0100 66BA000D0A00 MOV EDX,000A0D00
-u
1AB5:0100 66BA000D0A00 MOV EDX,000A0D00
1AB5:0106 CD14 INT 14
1AB5:0108 0000 ADD [BX+SI],AL...und man sieht jetzt, dass ich schon wieder mal vergessen habe, das h an den
int20 befehl anzuhängen.....;)(man müsste aber auf die Frage zurückantworten, das kommt auf den Zusammenhang an)
-
ghostcat schrieb:
nanu, beschwert sich nasm gar nicht über Zeichensetzung "char' ?
Doch, tut es.
Hat aber bisher auch niemand ausser dir so geschrieben.
Ist ein uralter Bug in der Asm-Syntax-Coloring-Erweiterung des Forums. Aus "" (und AFAIR auch '') wird "'.Ansonsten wurde im Wesentlichen ja schon alles Gesagt. Kommt eben drauf an, was genau mit "ersetzen" gemeint ist. Falls es nur um lesbareren Code geht, reicht wie gesagt ein kleines Macro.
-
Nobuo T schrieb:
Hat aber bisher auch niemand ausser dir so geschrieben.
Ist ein uralter Bug in der Asm-Syntax-Coloring-Erweiterung des Forums. Aus "" (und AFAIR auch '') wird "'.sicher dat?
der code von http://www.c-plusplus.net/forum/viewtopic-var-t-is-258820.html
wird nämlich von der passenden masm version bis auf diese Erscheinungen
anstandslos übersetzt. Naja...der Backer, also der Buchschreiber, hätte aber auch schon etwas mehr darauf achten können, eine gängigere Assemblersyntax zu verwenden, etwa die von nasm oder fasm.
-
ghostcat schrieb:
...eine gängigere Assemblersyntax zu verwenden, etwa die von nasm oder fasm.
-
ghostcat schrieb:
Nobuo T schrieb:
Hat aber bisher auch niemand ausser dir so geschrieben.
Ist ein uralter Bug in der Asm-Syntax-Coloring-Erweiterung des Forums. Aus "" (und AFAIR auch '') wird "'.sicher dat?
der code von http://www.c-plusplus.net/forum/viewtopic-var-t-is-258820.html
wird nämlich von der passenden masm version bis auf diese Erscheinungen
anstandslos übersetzt.Sicher, dass du ueberhaupt verstanden hast, was ich geschrieben habe?
Um es nochmal zu verdeutlichen:"bla!"
"bla!"
Mal abgesehen von den Tags (1. Block ist [ code] und 2. ist [ asm]) habe ich in beide oben stehenden Bloecke exakt den selben Inhalt eingegeben.
-
Im Endeffekt ist die Marke an der db verwendet wird lediglich die Adresse zu den entsprechenden Bytes.
Daher würde folgendes:
Marke1 db 0 Marke2 db 77, Marke1
versuchen hinter der 77 die Adresse zu schreiben. Da eine Adresse unter 32 Bit jedoch 4 Byte groß ist wird's mit dem db natürlich nichts und der Compiler meckert:
error A2071: initializer magnitude too large for specified size
Dagegen würde
Marke2 dd 77, Marke1
funktionieren, jedoch nicht das machen was du willst.
Richtig ist die Verwendung von equ. Im Endeffekt ist das nichts anderes als ein define, was der Compiler für dich an dieser Stelle einfügt. Hat dementsprechend auch nur optische Auswirkungen:
.686P .MODEL FLAT PUBLIC _msgCRLF, _msgProgress, _msgLoading, _msgFailure .DATA CRLF equ 13, 10, 0 _msgCRLF db CRLF _msgProgress db '*', 0 _msgLoading db 'Loading Second Stage Bootloader', CRLF _msgFailure db CRLF, 'BOOT2.BIN MISSING', CRLF END