2009-01-26 21 views
3

Dans ma classe de langage assembleur, notre première tâche consistait à écrire un programme pour imprimer une chaîne terminée par un dollar simple dans DOS. Il avait l'air quelque chose comme ceci:chaînes terminées par dollar

BITS 32 
    global _main 

section .data 
    msg db "Hello, world!", 13, 10, ’$’ 

section .text 
_main: 
mov ah, 9 
mov edx, msg 
int 21h 
ret 

Si je comprends bien, le signe $ sert à mettre fin à la piqûre comme nul ne en C. Mais que dois-je faire si je veux mettre un signe de dollar dans la chaîne (comme Je veux imprimer "ça coûte 30 $")? Cela semble être une question simple, mais mon professeur ne connaissait pas la réponse et je ne la trouve pas en utilisant une recherche google.

Répondre

7

Vous ne pouvez pas utiliser pour afficher $ signes service DOS 0x09, vous aurez besoin d'utiliser 0x02. Voir here.

+1

Il ressemble à 0x40 devrait fonctionner également: http://www.uv.tietgen.dk/staff/mlha/PC/Prog/asm/int/21/40.htm –

+0

Alternativement, vous pouvez utiliser 0x40, mais cela nécessite que vous spécifiiez le nombre d'octets à écrire (c'est-à-dire qu'il n'utilise pas de chaînes délimitées). –

+0

@Jason - Heh, me battre d'une seconde. :-) –

0

Um. Vous pourriez écrire l'assemblage qui serait pris en compte pour l'échappement $, par ex. \$? Mais votre \ devient un symbole spécial aussi, et vous devez utiliser \\ pour imprimer un \

-3

Try '$$', '\ 044' (octal) ou '\ x24' (hex)

+0

-1: aucune de ces options ne résoudra le problème. –

3

Ou faire votre propre print_string d'imprimer une chaîne terminée par NULL en utilisant le 29h sans papier INT (caractère d'impression AL).

; ds:si = address of string to print 
print_string: 
    lodsb     ; load next character from ds:si 
    or al, al    ; test for NULL-character 
    jz .end_of_string  ; end of string encountered, return. 
    int 29h     ; print character in AL on screen 
    jmp print_string  ; print next character 
.end_of_string: 
    ret      ; return to callers cs:ip 

(En supposant que vous utilisez MSNA)

+1

Notez que si vous utilisez INT 29h, la redirection de stdout ne fonctionnera pas (par exemple test.com> output.txt) –

0

Une façon est de trouver l'appel qui imprime un caractère unique. Vous pouvez imprimer n'importe quel personnage avec ça. Casser la chaîne et imprimer "ça coûte", puis le "$", et enfin, "30". Plus de travail, mais il fait le travail.

0

Vous pouvez utiliser 02 Service de 21H au lieu de 09 Service.

Voici l'exemple.

mov dl, '$' 

mov ah,02 

int 21h