2016-03-14 1 views
2

J'écris un programme DOS pour créer un fichier et y écrire. Je dois écrire les données dans deux lignes différentes. Voici mon code:Problèmes avec la sortie de caractères de nouvelle ligne dans un fichier

.model tiny 
.486 
.data 

fname db 'file5.txt',0 
handle dw ? 
msg db 'Prashant Pandey 2014A7PS100G' 

.code 
.startup 
mov ah,3eh 
mov bx,handle 
int 21h 

mov ah,3ch  ;the 4 lines from now open an new non-existing.3ch is used to open a new file 
lea dx,fname 
mov cl,2h 
int 21h 
mov handle,ax 

mov ah,40h  ;these 4 lines write to the already opened file 
mov bx,handle 
mov cx,28h 
lea dx,msg 
int 21h 

; new line 
mov dx,13 
mov ah,2 
int 21h 
mov dx,10 
mov ah,2 
int 21h 

mov ah,40h  ;these 4 lines write to the already opened file 
mov bx,handle 
mov cx,28h 
lea dx,msg 
int 21h 

mov ah,3eh 
mov bx,handle 
int 21h 

.exit 
end 

J'utilise MASM et DOSBOX. Le problème est que le programme imprime les données sur deux lignes différentes, mais avant la deuxième ligne, il imprime également des caractères étranges, puis imprime la chaîne msg. Quel est le problème avec ce programme, et comment puis-je le réparer?

+2

Semble la chaîne que vous voulez est 28 octets (décimal) de longueur et vous demandez d'écrire 28h (40 décimales) octets avec 'mov cx, 28h'. Peut-être que vous vouliez dire 'mov cx, 28'? –

+0

Mon mauvais.Je vais l'essayer. –

+2

Ou mieux, demandez à l'assembleur de calculer la longueur de votre chaîne, en utilisant une directive 'msglength equ $ -msg' juste après avoir défini' msg'. –

Répondre

4

Quelques problèmes dans votre code. Votre chaîne Prashant Pandey 2014A7PS100G est de 28 caractères, mais lors de l'écriture du fichier que vous spécifiez 28h (hex) avec les instructions suivantes:

mov cx,28h 

Je pense que vous vouliez dire à utiliser 28 décimales. Modifier les deux lignes qui correspondent à ce qui précède à

mov cx,28 

Une meilleure solution est d'obtenir l'assembleur pour calculer la longueur pour vous. Cela peut être fait en créant une constante qui représente la longueur de la chaîne. Un exemple de cela serait d'écrire ce droit après avoir défini msg:

MSGLEN equ $-msg 

Ainsi, le code ressemblerait à ceci:

msg db 'Prashant Pandey 2014A7PS100G' 
MSGLEN equ $-msg 

$ est l'équivalent du compteur de l'emplacement actuel. Juste après que vous définissez votre chaîne avec msg db le compteur d'emplacement sera l'emplacement de l'octet après le dernier caractère de msg. Si vous soustrayez l'adresse de l'étiquette msg, vous obtiendrez la longueur de la chaîne. la directive EQU crée effectivement une valeur constante que vous pouvez ensuite utiliser dans votre code. Maintenant, vous pouvez l'utiliser comme ceci:

mov cx, MSGLEN 

Maintenant, vous pouvez modifier la chaîne msg et vous n'avez pas à vous soucier de régler la taille manuellement dans votre code.


Le deuxième problème avec votre code est que INT 21h/AH=2h sa sortie standard (par défaut à la console si vous ne réorientent pas ailleurs). Votre code écrit des retours à la ligne dans la sortie standard au lieu du fichier. Vous pouvez résoudre ce en ajoutant la nouvelle ligne à msg lui-même avec le code comme:

msg db 'Prashant Pandey 2014A7PS100G',13,10 
MSGLEN equ $-msg 

Sinon, vous pouvez définir une autre chaîne qui contient 13,10 dans et utiliser INT 21/AH=40h d'écrire que sur comme vous le faisiez pour msg.