2013-06-25 3 views
2

그 이유를 모른 채 DB 20, 22 약간의 시간과 문자열을 정의했습니다 :'20, 22'문자열 DB 20, 22 dup ('?') '이 필요합니까?

내가 첫 번째 바이트 버퍼 크기는 것을 읽고 두 번째 문자열을 사용 바이트 수를 가지고,하지만 난 알고하지 않습니다 두 값 모두 필수입니다. 예를 들어 문자열을 정의하고 레지스터를 가리키고 싶다면 +2를 사용하여이 두 문자를 건너 뛸 수 있습니다. 난 그냥 lea si, string을 할 수있는 그들없이 문자열을 정의 아닌지 궁금한데

string DB 20, 22 dup('?') 
lea si, string+2 
lea si, [string] ; I think this is another alternative 

. 이것이 가능합니까 아니면 두 항목 모두 필수입니까? 또한 줄을 건너 뛰고 커서를 처음으로 옮길 때 DB 13, 10 컴파일러는 어떻게 13이 버퍼 크기가 아니고 문자 수가 10인지 알 수 있습니까? 나는 아마도 말도 안되는 말이지 만이 문제에 대한 설명은 감사 할 것입니다.

+0

'x dup (y)'는 "y"값의 "x"복사본을 작성하는 한 가지 방법입니다. 이것은 내게 길이 접두어가 붙은 20 '문자열로 보입니까?' 문자 수를 고려해야합니다. – cHao

+0

메모리에 문자열을 표현하는 몇 가지 방법이 있으므로 문자열에 대한 작업에 따라 다릅니다. –

+0

내가 신경 쓰지 않았기 때문에 dup()을 제거했습니다. 내가 알고 싶은 것 중 하나는 문자열을 정의하는 방법이 있다면 'lea si, string'으로 간단히 가리킬 수 있습니다. – lisovaccaro

답변

2

그냥 문자열을 원한다면, 그냥 정의

lea si, myString 

을하지만, 하나가 얼마나 오래 알고 있어야 string이 아니면 출력 함수가 멈출 위치를 알 수 있도록 터미네이터 문자를 추가해야합니다.

myString db 12, 'hello, world' 

1 바이트 문자열을 위해 좋다 : 당신이 당신의 20, 22이 무엇인지 될 수있는 문자열 앞에 길이를 넣을 수 있습니다,

myString db 'hello, world', 0 ; don't forget that terminator 

을 또는 : 당신이 원하는 경우, 예를 들어, 문자열을 0 종료 최대 255 자. 이보다 긴 문자열을 처리해야하는 경우 문자열 길이에 대해 2 바이트로 표준화하고 싶을 것입니다.

어느 쪽을 선택하든 출력 기능은 처리 방법을 알아야합니다.

길이가 접두사가 붙은 문자열을 원하면 길이를 직접 코딩하면 안됩니다. 어셈블러가 그것을 알아 내도록하십시오 :

+0

전 접두사를 접두어로 사용하고 싶지 않습니다.만약 내가 이렇게한다면 :'string DB 10 dup ('?')'나는 어떤 길이의 프리픽스도 붙이지 않는다. 그냥 처음 10자를 '?'로하고 싶다고 말하면됩니다. 나는 문자열을 직접 출력하지 않기 때문에 터미네이터는 신경 쓰지 않는다. – lisovaccaro

0

"db 20, 22 dup (?)"은 실제로 다음과 같은 바이트를 메모리에 넣습니다 : 0x14 0x00 0x00 0x00 ..... (0x00의 22 배). 이러한 종류의 파스칼 스타일 문자열은 첫 번째 바이트에 문자열 길이가 포함되어 있습니다.

그런 문자열을 정의 할 필요가 없습니다.

db 13, 10은 단순히 "0x0d"및 "0x0a"바이트를 의미합니다.

myString db 'hello, world' 

을 그리고 당신은 가리 켰을 때, 당신은 그것을 해결할 수 :