2017-05-24 57 views
1

這是我的代碼在NASM超過9 NASM增量寄存器不能顯示

寫道

此代碼是找到字符串S1字符串s2,如果發現或返回-1,如果沒有找到返回指數。

我的麻煩是我的EBX(索引),它增加了1,2,3 ... 9確定,但是當它變爲10時,它們將顯示':'或11它顯示';'

我不知道爲什麼?請幫助

非常感謝

對不起,我英文不好

; 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

謝謝,我怎樣才能解決? –

+0

那麼,要在屏幕上顯示「10」,您必須輸出兩個字符,數字1和數字0.因此,您需要將整數值轉換爲字符串。這裏是DOS平臺目標的相同問題(所以你必須改變OS服務調用的字符輸出爲linux 64b''syscall',並且你可以在需要時使用32/64b寄存器):https://stackoverflow.com/q/40503119/4271923或使用谷歌,有很多問題+這樣的答案在SO上,但我從來沒有幸運通過SO搜索找到適當的一個,你應該有更多的運氣通過谷歌和添加特定的關鍵字。還搜索教程/書籍。 – Ped7g

回答

1

的問題是您要顯示一個數字作爲一個字符。

add ebx, '0' 

是將數字轉換爲字符以顯示的好方法。將數字轉換爲字符以供顯示是一種不好的方法。

你想以下幾點:

; 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

如果我刪除add ebx,'0',它會顯示意外字符:(你能建議我解決這個問題嗎? –

+0

@ĐinhVănKiệt:你應該用EBX中的值調用itoa,而不是簡單地刪除'add ebx, '0''。 –

+0

爲了確定記錄的正確性,他問我在完成答案之前所做的修正是什麼。 – Joshua