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
    

Anmelden zum Antworten