2017-05-24 1 views
1

est mon code écrit dans MSNANasm registre d'incrément sur 9 ne peut pas afficher ce

Ce code est de trouver la chaîne s2 dans la chaîne s1, indice de rendement si trouvé ou retourner -1 si introuvable.

Mon problème est mon EBX (index), il augmente 1,2,3, .. 9 ok mais quand inc à 10, ils montreront ':' ou 11 montrer ';'

Je ne sais pas pourquoi? S'il vous plaît aider

Un grand merci

Désolé pour mon mauvais anglais

; DINH VAN KIET 
; TUAN 3 
; Find String 32bit 

; Build 
; nasm -f elf find_string_32bit.asm -o find_string_32bit.o ; file object will be created 
; ld -m elf_i386 -o find_string_32bit find_string_32bit.o ; link the object file and create executable file 

; MO TA 
; Tim chuoi s2 trong chuoi s1 

SYS_EXIT EQU 1 
SYS_READ EQU 3 
SYS_WRITE EQU 4 
STDIN EQU 0 
STDOUT EQU 1 

%define LEN 64 ; do dai toi da 
%define LEN_STT 2 

segment .data 
    msgS1 db 'Nhap chuoi s1: ' 
    msgS1Len equ $ - msgS1 
    msgS2 db 'Nhap chuoi s2 (can tim): ' 
    msgS2Len equ $ - msgS2 
    pos dw 00 

segment .bss 
    s1 resw LEN 
    s2 resw LEN 

    temp resb 1 

segment .learn 
    global _start 
_start: 
    mov edx,msgS1Len 
    mov ecx,msgS1 
    call display 

    mov edx,LEN 
    mov ecx,s1 
    call read 

    mov edx,msgS2Len 
    mov ecx,msgS2 
    call display 

    mov edx,LEN 
    mov ecx,s2 
    call read 

    ; dung eax de xu ly chuoi s2 
    mov eax,[s2] 
    mov edx,0 ; dung edx lam index 

    ; dung ecx de xu ly chuoi s1 
    mov ecx,s1 
    mov ebx,-1 ; dung ebx de dem 

lap1: 
    ; kiem tra het chuoi 
    cmp byte[ecx],0 
    je done 

    ; duyet tung ki tu cua s2 
    mov eax,[s2+edx] 
    mov [temp],eax 

    ; de test 
    ;push ebx 
    ;push edx 
    ;push ecx 
    ;mov edx,1 
    ;mov ecx,temp 
    ;call display 
    ;pop ecx 
    ;pop edx 
    ;pop ebx 

    ; dua cac ki tu vao thanh ghi al va ah de so sanh 
    mov al,byte[ecx] 
    mov ah,[temp] 

    cmp ah,0xA ; kiem tra xem da het chuoi s2 hay chua? 
    je done 

    inc ebx ; tang bien vi tri 
    inc ecx ; tang index cua ecx 

    cmp al,ah ; kiem tra xem ki tu co khop nhau hay ko? 
    je meet 
    jne miss 

    jmp lap1 

; Neu khop 
meet: 
    cmp edx,0 
    jne met 

    push ebx 

    inc edx ; tang bien edx de kiem tra tiep s2 
    jmp lap1 

; Neu tiep tuc khop 
met: 
    inc edx 
    jmp lap1 

; Neu khong khop 
miss: 
    mov edx,0 ; dua edx ve dau s2 de kiem tra lai 
    jmp lap1 

; Neu tim thay 
found: 
    ; in ra vi tri tim thay 
    pop ebx 
    add ebx,'0' 
    jmp exit 

; Neu khong tim thay 
notfound: 
    ; in ra -1 
    mov ebx,'-1' 
    jmp exit 

done: 
    cmp edx,0 
    je notfound 
    jne found 

exit: 
    mov [pos],ebx 

    mov edx,2 
    mov ecx,pos 
    call display 

    mov eax,SYS_EXIT 
    int 80h 

display: 
    mov eax,SYS_WRITE 
    mov ebx,STDOUT 
    int 80h 
    ret 

read: 
    mov eax,SYS_READ 
    mov ebx,STDIN 
    int 80h 
    ret 
+0

http://asciitable.com/ (' '0' + 10 = ':'') – Ped7g

+0

Merci, comment puis-je résoudre ce problème? –

+0

Eh bien, pour afficher "10" à l'écran, vous devez sortir deux caractères, chiffre 1 et chiffre 0. Vous devez donc convertir la valeur entière en chaîne. Voici la même question avec la cible de la plate-forme DOS (donc vous devrez changer les appels de service du système d'exploitation pour la sortie char pour le 'syscall' de Linux 64b, et vous pouvez utiliser les registres 32/64b si nécessaire): https://stackoverflow.com/q/40503119/4271923 ou utiliser google, il y a beaucoup de questions + réponses comme ça sur SO, mais je n'ai jamais eu de chance de trouver une bonne recherche SO, vous devriez avoir plus de chance grâce à google et en ajoutant des mots-clés spécifiques. Recherchez également un tutoriel/livre. – Ped7g

Répondre

1

Le problème est que vous affichez un numéro comme un personnage.

add ebx, '0' 

est un bon moyen de convertir un chiffre en caractère à afficher. C'est un mauvais moyen de convertir un nombre en un caractère pour l'affichage.

Vous voulez ce qui suit:

; variable in ebx 
itoa: 
    mov eax, ebx 
    mov ecx, 10 
    mov esi, buf + 10 
    xor edx, edx 
.nxt 
    div ecx 
    add dl, '0' 
    dec esi 
    mov [esi], dl 
    or eax, eax 
    jnz .nxt 
    mov edx, buf + 10 
    sub edx, esi 
    ret 

    ; pointer in esi, length in edx 

;... (bss area) 
buf resb 10 
+0

Si je supprime ajouter ebx, '0', il montrera caractère inattendu :(Pouvez-vous me suggérer de résoudre ce problème? –

+0

@ ĐinhVănKiệt: Vous êtes censé appeler itoa avec la valeur dans EBX, au lieu de supprimer simplement ajouter ebx, '0'. –

+0

Afin de remettre les pendules à l'heure, il a demandé quelle était la solution avant que j'aie tapé la réponse. – Joshua