الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعده بسيطه

بدأه كن سعيد في 8 يناير 2011 · 7 رد · 1,425 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبكاته

عندي استفسار انا حليت هذا السؤال بس طلع لي خطأيين ماني عارفه ايش فياليت تساعدوووني

السؤال :

Write an assembly language program that prompts the user for two input strings and computes the Hamming distance between the two strings. The Hamming distance is the number of bit positions where the two strings differ.

الكوود :


.MODEL SMALL
.STACK 100H
.DATA
MSGE1 DB 'Enter the two strings: $'
MSGE2 DB 0DH,0AH,'The Hamming distance between the following two strings is : $'
MSG DB 255 DUP('$')
MSG2 DB 255 DUP('$')
A DW ?
HMNG DB ?
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV AH, 9
LEA DX, MSGE1
INT 21H
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
MOV CX,0
XOR BX,BX
MOV AH,1
INT 21H
WHILE_:
CMP AL,0DH
JE EXIT
MOV MSG[BX],AL
INT 21H
INC BX
LOOP WHILE_
EXIT:
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
XOR SI,SI
MOV AH,1
INT 21H
WHILE2_:
CMP AL,0DH
JE EXIT2
MOV MSG2[SI],AL
INT 21H
INC SI
JMP WHILE2_
EXIT2:
XOR DX,DX
XOR BX,BX
XOR SI,SI
XOR CX,CX
LOOP_:
CMP BX,0
JE END_
CMP SI,0
JE END_
MOV DX,MSG[BX]
MOV AX,MSG2[SI]
XOR AX,DX
JMP ONE
TOW:
INC BX
INC SI
JMP LOOP_
MOV CX,16
ONE:
SHL AX,1
JNC ONE
INC HMNG
LOOP ONE
JMP TOW
END_:
MOV AH, 9
LEA DX, MSGE1
INT 21H
MOV AL,HMNG
MOV AH,2
INT 21H
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN

الأخطاء :

MAH.ASM(59): error A2070 invalid instruction operands

MAH.ASM (60) : error A2070: invalid instruction operands

تم تعديل هذه المشاركة بواسطة كن سعيد في 8 يناير 2011 في 19:33

#2

وعليكم السلام،

بداية أذكر باختيار عنوان مناسب للموضوع في المرة القادمة.

بالنسبة للكود، برجاء مراجعة قسم data، أعتقد أن المنتدى قام بإزالة بعض الـ single quotes التي تحيط بالنصوص عندما تم نشر الموضوع.

يرجى إعادة لصق قسم الـ data مرة أخرى.

بالنسبة للأخطاء التي تظهر لديك، يرجى تزويدنا بصورة كاملة للأخطاء أو نسخ نص الخطأ بالكامل، فشخصياً لا أملك نسخة 16bit حالياً من المجمع لتجربته.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

السلام عليكم

الحمد الله عرفت خطئي بس واجهة مشكلة ثانيه

لما اسوي run مايقول فيه ولا خطأ بس يخليني ادخل جمله وبس ما يكمل البرنامج

الرجاء الإفاده

وشكرا

الكود بعد التعديل

.MODEL SMALL	
.STACK 100H
.DATA
   MSGE1   DB  'Enter the two strings:  $'
   MSGE2   DB  0DH,0AH,'The Hamming distance between the following two strings is :  $'
   MSG 	DB  255   DUP('$' )
   MSG2    DB  255   DUP('$' )
   A   	DW  ?
   HMNG    DB  ?
.CODE
MAIN PROC
MOV AX, @DATA    
MOV DS, AX
MOV AH, 9                
LEA DX, MSGE1   		
INT 21H
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
MOV CX,0
XOR BX,BX
MOV AH,1
INT 21H
WHILE_:
CMP AL,0DH
JE   EXIT
MOV  MSG[BX],AL
INT  21H
INC  BX
LOOP  WHILE_
EXIT:
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
XOR SI,SI
MOV AH,1
INT 21H
WHILE2_:
CMP AL,0DH
JE   EXIT2
MOV  MSG2[SI],AL
INT  21H
INC  SI
JMP  WHILE2_
EXIT2:
XOR DX,DX
XOR BX,BX
XOR SI,SI
XOR CX,CX
LOOP_:
CMP MSG[BX],0
JE  END_
CMP MSG2[SI],0
JE  END_
MOV DL,MSG[BX]
MOV AL,MSG2[SI]
XOR AL,DL
JMP ONE
TOW:
INC BX
INC SI
JMP  LOOP_
ONE:
MOV CX,8
ONE_:
SHL AL,1
JNC ONE_
INC HMNG
LOOP ONE_
JMP TOW
END_:
MOV AH, 9                
LEA DX,MSGE2   		
INT 21H
MOV AL,HMNG
MOV AH,2
INT 21H                                              
MOV AH, 4CH	
INT 21H        	
MAIN ENDP
END MAIN
#4

تعديل سريع و dirty، فيه bugs في حالات مثل (أن يكون الفرق بين السلسلتين أكبر من 9)

أو أن يتم إدخال سلاسل نصية طويلة تتجاوز الحد المسموح للـ buffer.. إلخ

يمكن إصلاح المشاكل بسهولة مع القليل من التركيز.

.MODEL SMALL	
.STACK 100H
.DATA
   MSGE1   DB  'Enter the two strings: $'
   MSGE2   DB  0DH,0AH,'The Hamming distance between the following two strings is : $'
   MSG 	DB  255   DUP('$')
   MSG2	DB  255   DUP('$')
   HMNG	Dw  0
.CODE
MAIN PROC
MOV AX, @DATA	
MOV DS, AX
MOV AH, 9            	
LEA DX, MSGE1       	
INT 21H
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
XOR BX,BX
MOV AH,1
INT 21H
WHILE_:
CMP AL,0DH
JE   EXIT
MOV  MSG[BX],AL
INT  21H
INC  BX
JMP  WHILE_
EXIT:
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
XOR SI,SI
MOV AH,1
INT 21H
WHILE2_:
CMP AL,0DH
JE   EXIT2
MOV  MSG2[SI],AL
INT  21H
INC  SI
JMP  WHILE2_
EXIT2:
; 
mov cx,si
cmp bx,si
jbe @F
mov cx,bx
@@:
xor bx,bx
xor si,si
@loop:
mov al,MSG[BX]
cmp al,MSG2[SI]
je @F
add HMNG,1
@@:
inc bx
inc si
loop @loop
;
MOV AH, 9            	
LEA DX,MSGE2       	
INT 21H
MOV DX,HMNG
add dl,30h
MOV AH,2
INT 21H                                          	
MOV AH, 4CH 	
INT 21H     	
MAIN ENDP
END MAIN

مثال:

Enter the two strings:xacker26
x4ck3r256
The Hamming distance between the following two strings is : 4

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

مشـــــــــــــــــــــــــــــــكور اخوي

ويعطيك الف الف عافيه على المساااعد

:ty:

#6

السلالام عليكم

آسفين على الأزعاج يأخ xacker

بس مو هذا المطلوب من السؤال أنا ابغى احسب الإختلاف في عدد الbits مثل هذا المثال :

“foo” = 0110 0110 0110 1111 0110 1111

“bar” = 0110 0010 0110 0001 0111 0010

So, the Hamming distance between “foo” and “bar” is 8.

أنا فكرة اسوي XOR بين الجمليتين راح يكون المتشابه يعطيني 1 والمختلف 0 واسوي كمان shift واحسب الcarry فيطلع لي

ال Hamming distance مثل الكود الي عدلت عليه انا (الثاني) بس ماضبط.

وفيه tow leable مافهمت الغرض منها في الكود تبعك الي هي : f@ و @@.

فياليت تفدوونا

وشكرا

#7

صحيح، فاتتني هذه :ph34r:

الكود بعد التعديل:

.286
.MODEL small 
.STACK 100H
.DATA
   MSGE1   DB  'Enter the two strings: $'
   MSGE2   DB  0DH,0AH,'The Hamming distance between the following two strings is : $'
   MSG  DB  255   DUP(0)
   MSG2 DB  255   DUP(0)
   HMNG DW  0
   buffer	db 10 dup (0)
.CODE
MAIN PROC
MOV AX, @DATA   
MOV DS, AX
;
MOV AH, 9               
LEA DX, MSGE1         
INT 21H			; display MSGE1
;
MOV AH,2
MOV DL,0DH		
INT 21H			; insert Carriage-Return
MOV DL,0AH		
INT 21H			; insert Line-Feed
; in other words, insert CRLF (new line)
XOR BX,BX		; clear the base register
MOV AH,1
INT 21H			; read byte from std input with echo
@@:
CMP AL,0DH		; is it Enter?
JE   @F		; move to next message if yes
MOV  MSG[BX],AL	; store the byte
INT  21H		; get next byte
INC  BX	
JMP  @B			; loop
@@:
;
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
;
XOR SI,SI		; clear index register
MOV AH,1
INT 21H			; read byte from std input with echo
@@:
CMP AL,0DH		; is it Enter?
JE   @F		; move to hamming distance calculation
MOV  MSG2[SI],AL; store the byte
INT  21H		; get next byte
INC  SI
JMP  @B			; loop
@@:
; 
mov cx,si	; consider SI is the length of longest message
cmp bx,si	; compare SI with BX
jbe	@F		; jump if BX <= SI; keep CX = SI
mov cx,bx	; no, BX is the length of longest message
@@:
test cx,cx	; perhaps s/he decided not to enter anything.
je	@finish	; make sure, just to be on the safe side
xor bx,bx	; clear BX
xor si,si	; clear SI
xor	ax,ax	; clear AX
@next_byte:
mov al,MSG[BX]	; load AL with byte at offset BX
mov	dl,MSG2[SI]	; load DL with byte at offset SI
xor	al,dl		; clear out matching bits
@next_bit:
shr	al,1		; move bits into carry flag one by one
jnc @F			; jump if no carry
inc	HMNG		; increase hamming distance
@@:
test al,al		; if AL = 0 then we finished checking this byte
jnz	@next_bit	; no, we still have bits, move to next
inc bx
inc si
loop @next_byte
@finish:
mov		ax,offset buffer
push	ax
push	HMNG
call	wtoa
;
MOV AH, 9               
LEA DX,MSGE2            
INT 21H
;
lea	dx,buffer
INT 21H    
;                                             
MOV AH, 4CH     
INT 21H     
MAIN ENDP

wtoa proc
	push	bp
	mov		bp,sp
	;uses
	push	bx
	push	si
	push	di
	;
	mov		ax, [bp+4]
	mov		di, [bp+6]
	test	ax,ax
	jnz	sign
zero:
	mov		word ptr [di],30h
	jmp	dtaexit
sign:
	jns	pos
	mov		byte ptr [di],'-'
	neg		ax
	add		di,1
pos:
	mov		cx,52429
	mov		si,di

@@:
	mov		bx,ax
	mul		cx
	shr		dx,3
	mov		ax,dx
	shl		dx,2
	add		dx,ax
	add		dx,dx
	sub		bx,dx
	add		bl,'0'
	mov		[di],bl
	add		di,1
	cmp		ax,0
	jg		@B

	mov		byte ptr [di],'$'

@@:
	sub		di,1
	mov		al,[si]
	mov		ah,[di]
	mov		[di],al
	mov		[si],ah
	add		si,1
	cmp		si,di
	jl		@B

dtaexit:

	pop		di
	pop		si
	pop		bx

	mov		sp,bp
	pop		bp
	ret
wtoa	endp
END MAIN

قمت بإضافة الإجرائية wtoa أيضاً التي ستقوم بتحويل مقدار الفرق من قيمة word إلى رقم صحيح بالأسكي حتى يمكن طباعة الأرقام التي تزيد عن 9 بشكلها الصحيح العشري بدلاً من الرموز غير المفهومة.

بالنسبة لـ

@F

@B

@@:

فـ F@ تشير إلى اللافتة @@ الأقرب من الأمام (forward)

و B@ تشير إلى اللافتة @@ الأقرب من الخلف (backward)

فمثلاً:

@@:
;...
@@:	; jumps here with @B <------.
;...	;			    |
;...	;			    |
jmp	@F ;--------------------.   |
jmp	@B ;--------------------+---'
;...	;			|
;...	;			|
@@:	; jumps here with @F <--'
;...
@@:

والنتيجة:

D:\masm>test
Enter the two strings:
xacker
x4ck3r
The Hamming distance between the following two strings is : 8
D:\masm>test
Enter the two strings:
east
west
The Hamming distance between the following two strings is : 3
D:\masm>test
Enter the two strings:
north
south
The Hamming distance between the following two strings is : 7
D:\masm>test
Enter the two strings:
minus
plus
The Hamming distance between the following two strings is : 17
D:\masm>test
Enter the two strings:
foo
bar
The Hamming distance between the following two strings is : 8

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8

:clapping:

thank you

مواضيع مشابهة