2016-08-28 1 views
0

J'essayais de créer un code d'assemblage, de demander une chaîne, de commencer à imprimer la chaîne et d'imprimer la longueur désirée. supposons que start et length sont toujours valides Pouvez-vous m'aider à déterminer le début et la longueur.Impression d'une chaîne avec un langage d'assemblage de début et de longueur

Comment ça devrait fonctionner:

Enter String: Hello World 
Enter Start: 3 
Enter Length: 5 
Mid-String: llo W 

J'ai un problème sur la façon de déterminer le début et la longueur de la chaîne. J'ai essayé plusieurs choses qui est montré dans mon code ci-dessous:

.model small 
.stack 
.data 
msg1 db "Enter String:$" 
msg2 db 13,10,"Enter Start:$" 
msg3 db 13,10,"Enter Length:$" 
msg4 db 13,10,"Mid-String:$" 
nwln db 13,10 
mySample label byte 
maxlen db 10 
actlen db 0 
string db 19 dup (?) 
.code 
mov ax,@data 
mov ds,ax 
    lea dx, msg1 ;print msg1 
    mov ah,9 
    int 21h 

    lea dx,mySample ;accept string 
    mov ah,0Ah 
    int 21h 

    mov bh,0 
    mov bl,maxlen 
    mov string[bx],'$' 
    mov ah,9 
    lea dx,string ;print string accept 
    int 21h 

    lea dx, msg2 ;print msg2 and accept start 
    mov ah,9 
    int 21h 
    mov ah,1 
    int 21h 
    sub al,30h 
    mov bh,0 
    mov bl,al 

    lea dx, msg3 ;print msg3 and accept length 
    mov ah,9 
    int 21h 
    mov ah,1 
    int 21h 
    sub al,30h 
    mov dl,al 

    ;mov maxlen,dl 
    mov bh,0 
    mov bl,maxlen 
    mov string[bx],'$' 
    lea dx,msg4  ;print msg4 
    mov ah,9 
    int 21h 
    lea dx,string ;print mid-string 
    int 21h 
mov ah,4ch 
int 21h 
END 

SORTIE RESSEMBLE: output from the code above

+0

Lorsque vous effectuez un seul pas dans un débogueur, les nombres que vous lisez se terminent-ils réellement dans des registres comme prévu? Les valeurs dans les registres avant le dernier int 21h sont-elles celles que vous attendez d'elles? Si non, travaillez en arrière pour trouver où les choses ont cessé de se comporter comme vous l'attendiez. –

+0

Chouny, il y a une nouvelle réponse à votre question, vérifiez-la! –

Répondre

1

Basé sur un coup d'œil sur les dernières instructions, où vous faites réellement l'impression offset et (en supposant le reste de votre code seulement imprime et lit les chaînes correctement):

vous avez oublié de convertir ASCII à un nombre entier, de sorte que vous écrivez les terminant $ nombre d'octets après la fin de la chaîne ('0' pour être précis: le codage ASCII de 0).

Vous ne semblez pas utiliser le décalage de début pour quoi que ce soit. Il serait facile de faire quelque chose comme lea dx, [string + bx] après avoir obtenu atoi(start_offset_string) dans BX.

Votre longueur compte depuis le début de la chaîne d'origine et non depuis la position de décalage. Vous voudrez peut-être faire l'offset en premier.

+0

Je ne comprends pas du tout Je veux dire que vous devez accepter un nombre pour définir le début de la chaîne que j'ai fait et je mets est comme mov bl, al. – Chouny

+0

@Chouny: regardez BL dans un débogueur dans la partie du code juste avant d'imprimer la chaîne. Je vois cette instruction dans votre code, et je pense toujours que ma réponse est correcte. Écrire asm sans débogueur revient à construire un robot avec les yeux bandés, alors apprenez à utiliser votre débogueur et vous comprendrez cette réponse. –

+0

BX = 000A, ce qui est vrai, puis BX = 0102 puis 0002 puis 000A à nouveau. Je ne sais pas ce qui s'est passé mais je sais que ça ne démarre pas ou pas. – Chouny

0

J'ai fait quelques petits changements à votre code pour le faire fonctionner, ces petits changements sont commentés, essentiellement, il s'agissait d'utiliser des pointeurs correctement (pointeurs pour commencer position et longueur), que j'ai remplacés par SI et DI :

.model small 
.stack 
.data 
msg1 db "Enter String:$" 
msg2 db 13,10,"Enter Start:$" 
msg3 db 13,10,"Enter Length:$" 
msg4 db 13,10,"Mid-String:$" 
nwln db 13,10 
mySample label byte 
maxlen db 10 
actlen db 0 
string db 19 dup (?) 
.code 
mov ax,@data 
mov ds,ax 
    lea dx, msg1 ;print msg1 
    mov ah,9 
    int 21h 

    lea dx,mySample ;accept string 
    mov ah,0Ah 
    int 21h 

    mov bh,0 
    mov bl,actlen ;◄■■■ NOT MAXLEN. 
    mov string[bx],'$' 
    mov ah,9 
    lea dx,string ;print string accept 
    int 21h 

    lea dx, msg2 ;print msg2 and accept start 
    mov ah,9 
    int 21h 
    mov ah,1 
    int 21h 
    sub al,30h 
    mov bh,0 
    mov bl,al 
    mov si,bx  ;◄■■■ SAVE BX IN SI, BECAUSE WE WILL NEED 
        ;◄■■■ BX FOR SOMETHING ELSE (SI = "START"). 

    lea dx, msg3 ;print msg3 and accept length 
    mov ah,9 
    int 21h 
    mov ah,1 
    int 21h 
    sub al,30h 
    mov bl,al  ;◄■■■ REPLACE DL BY BL BECAUSE DX WILL 
        ;◄■■■ BE USED TO DISPLAY WITH INT 21H. 
    ;mov maxlen,dl 
    mov bh,0  ;◄■■■ NOW BX = "LENGTH". BUT WE WILL NEED 
    mov di,bx  ;◄■■■ BX AGAIN, SO LET'S MOVE "LENGTH" TO DI. 

    ;mov bl,maxlen 
    add di, si   ;◄■■■ CALCULATE END POSITION. 
    dec di, 1   ;◄■■■ MINUS 1 BECAUSE IT STARTS IN 0. 
    mov string[di],'$' 
    lea dx,msg4  ;print msg4 
    mov ah,9 
    int 21h 
    ;lea dx,string ;print mid-string 
    mov dx,offset string 
    add dx,si 
    int 21h 
mov ah,4ch 
int 21h 
END