ユーザーが入力した 2 つの文字列間のハミング距離を判断するために、このアセンブリ コードを作成しました。私はアセンブリにまったく慣れていないので、helloWorld を書く以外は初めての試みです。
2 つの文字列間の距離の印刷を除けば、コードは正しいはずだと思います。
extern printf
extern sscanf
extern fscanf
section .data ; instatiating constants ( variables )
msg1: db "Enter string to be compared less than 256 characters:",10 ; db allocates
;space in memory
len1: equ $-msg1
msg2 db "Enter another string to be compared:",10 ;
len2: equ $-msg2
count: dd 0 ;for the hamming code loop
; another string for "hamming distance"
; maybe make an error message
section .bss ; reserve space for data
;; the bss section typically includes all uninitialized variables, as
;; well as uninitialized variables declared STATIC
input1: resb 256 ; 256 is max length of buffer
input2: resb 256 ; " "
length1: resb 4 ; reserve length of first string
length2: resb 4 ; reserve lenght of second string
section .text ;
global main
main:
; access to the contents of a memory location
; requires square brackets around the address
;; any access to the address of a variable doesn't require brackets
; mov is
;; http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-ca lls.html
;; Prompt user for input
mov eax, 4 ; moves sys_call write to eax
mov ebx, 1 ;moves std_out to ebx
mov ecx, msg1
mov edx, len1
int 0x80 ; could do 080h , calls kernel to write
;;
;;
;; Get user input
mov eax, 3 ;Moves sys_call read to eax
mov ebx, 0 ;Moves sys_call std_in to ebx
mov ecx, input1 ; address of buffer
mov edx, 255
int 0x80 ;length of buffer
;;
;;
;; Error checking
sub eax,1 ;remove carriage return
mov [length1], eax ;save length of string
;; Prompt user for input
mov eax, 4 ; moves sys_call write to eax
mov ebx, 1 ;moves std_out to ebx
mov ecx, msg2
mov edx, len2
int 0x80 ; could do 080h , calls kernel to write
;;
;;
;; Get user input
mov eax, 3 ;Moves sys_call read to eax
mov ebx, 0 ;Moves sys_call std_in to ebx
mov ecx, input2 ; address of buffer
mov edx, 255
int 0x80 ;length of buffer
;;
;;
;; Error checking
sub eax,1 ;remove carriage return
mov [length2], eax ;save length of string
loop:
mov esi, input1 ; point to start of string1
mov edi, input2 ; point to start of string2
mov eax,[length1] ; compare string sizes
mov ebx,[length2] ; and loop based on smallest
cmp eax,ebx ; string size
jg str2_Sml ; string2 is smaller jump
; string1 is smaller...
mov ecx, eax ; initialize count
jmp L1_test ; start the loop
str2_Sml:
mov ecx, ebx ; initialize count
jmp L1_test ; start the loop
L1_test:
cmp ecx,31 ; if there are more then 31 chars
jb L1_top
mov ecx,31 ; fail safe
L1_top:
mov al, [esi] ; get a character from str1
mov bl, [edi] ; get a character from str2
inc esi ; update str1 ptr
inc edi ; update str2 ptr
xor al, bl ; find the different bits
mov ah, 8 ; setup innerloop counter
L2_top:
dec ah ; decrement bit counter
jz L1_cont ; get new char to ham every
; 8 bits
shr al,1 ; rotate string1
jc Bit_on ; bit is on
jmp L2_top ; bit is off so re-loop
Bit_on:
; we have a different bit
inc dword [count] ; inc ham count
jmp L2_top ; cont loop
L1_cont:
dec ecx ; update char count
jnz L1_top ; loop to top if more chars
;trying to print
これが私のエラーがある場所だと思います:
mov eax, 4 ; moves sys_call write to eax
mov ebx, 1 ;moves std_out to ebx
mov ecx,ecx
mov edx, 255
int 0x80 ; calls kernel
exit:
mov eax, 1 ;exit
mov ebx, 0 ;
int 0x80 ;kernel command