2014-10-22 6 views
0

큰 프로젝트에서 작업하고 있지만 문자열 조작으로 문제가 있습니다. 내 어셈블리 파일에는 연산 보조 프로세서 연산 ("FINIT"으로 보조 프로세서가 시작됨)이 포함되어 있지만 간섭을 일으키지 않아야한다고 생각하지 않습니다. 나는 일시적으로 저장하는 레지스터를 사용하려고어셈블리에서 문자열 조작 x86 (mov 및 화면에 인쇄)

$s db 50 dup (?), '$' 
_cte_14 db "hello world", '$', 39 dup (?) 

나는 "$의" 변수에 변수 "_cte_14"에 저장된 값을 지정해야합니다 는 기본적으로, 길이 50 ​​바이트 각 일부 문자열이 값은 다음과 같습니다 :

mov cx, _cte_14 
mov $s, cx 

그러나 "피연산자 유형이 일치하지 않습니다"라는 오류가 발생합니다. 내가 도끼를 알고 있기 때문에

는, BX는, CX는, DX는 내가 첫 번째 문자열 문자의 메모리 주소로 작동 할 필요가 어쩌면 생각, 내가 노력 만이 16 개 비트를 개최 등록 :

mov bx, offset _cte_14 
mov $s, bx 

하지만, 같은 오류가 나타납니다.

저는 TASM을 사용하여 x86 프로세서 용으로 컴파일하고 있습니다. 이것을 성취하는 올바른 방법은 무엇입니까?

미리 감사드립니다.

루프에서 문자를 복사 할
+1

당신이에서 문자를 복사해야 루프 또는 string move ('movsb') 명령을 사용합니다. – Jester

답변

1

예 :

s db 51 dup ('$') 
_cte_14 db "hello world" 
len = ($ - _cte_14) ; (current location - offset _cte_14) 
40 dup ('$') 

mov si, offset _cte_14 ; get source offset 
mov di, offset s  ; get destination offset 
mov cl, len   ; length of the string 
P1: 
mov al, [si]   ; get byte from DS:SI 
mov [di], al   ; store byte to DS:DI 
dec cl     ; decrease counter, set zero flag if zero 
jnz P1     ; jump if zero flag is not set 

- 반복 명령 접두어와 함께 문자열 명령을 사용하여와 변화 :

mov si, offset _cte_14 
mov di, offset s 
mov cx, len ; length of the string 
cld   ; clear direction flag 
rep movsb ; copy from DS:SI to ES:DI, increase SI+DI, decrease CX, repeat CX times 
+4

당신이 제공/고치고있는 것에 대한 귀하의 답변에 도움이 될만한 약간의 의견이있을 것입니다. – Seki

+0

감사합니다 !! 나는 여전히 조금 혼란 스럽다. .data 선언을 약간 변경했기 때문에 코드를 완전히 이해하지 못했다. "len"에는 소스 문자열의 길이가 어떻게 포함되어 있는지 확실하지 않습니다. 또한,'40 dup ('$')이 무엇 인지도 모릅니다. .DATA 세그먼트를 변경하지 않고 소스 길이를 수동으로 삽입하지 않고 코드를 시도했습니다 : 'mov cl, 12; ' "안녕하세요 세계 $"의 길이는 $ S의 내용을 인쇄하려면이 추가 : $의 mov 인 AH를 OFFSET, 9 INT 21h' 을 'mov 인 DX를하지만 내가 가진 모든 초기 "시간"이었다 그리고 빈 공간이 많다. – Floella

+0

신경 쓰지 마라! 누락 된 부분을 찾아 냈습니다. 루프 코드가 완벽하고 'inc'및 'inc di'만 누락되었습니다. 'dec cl' 바로 전에 추가되었으며 매력처럼 작동했습니다. 감사합니다. – Floella