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