2011-10-04 4 views
2

.string은 어셈블리에서 무엇을합니까? 인라인 ASM 전화에서어셈블리의 문자열

는 C에서, 나는 누군가가 나에게 얼마나 .string 작품의 개요를 제공 할 수

.string \"Hello World\" 

1)을 썼다?

2) 그 값은 % esi에 저장됩니다. 왜?

3) 어떻게 마지막에 왕복 객차를 추가 할 수 있습니까? \ n을

+2

어떤 어셈블러를 사용하고 있습니까? 가스? –

+0

예. 글쎄, 제 운영체제는 x86 리눅스이고 저는 __asm__을 가진 어셈블리를 c로 작성하고 gcc에서 컴파일하므로 GAS가 맞습니까? – Gabe

+0

어떤 종류의 인용/이스케이프 문제 인 것처럼 들리므로 주변 코드를 볼 필요가 있습니다. – user786653

답변

2

.string.long, .int, 또는 .byte 유사 GAS에서 어셈블러 지시자입니다 작동하지 않습니다. 프로그램에서 사용할 메모리를 만들고 초기화하는 것뿐입니다. 이 경우 어셈블러에서는 13 개의 연속 된 13 바이트의 메모리 공간에 13 개의 문자를 할당합니다. 당신이 메모리에서 본다면, 당신은이를 볼 것입니다 :

["][H][e][l][l][o][ ][W][o][r][l][d]["] 

을 진수가 아닌 문자를 제외하고. 나는 어떻게 또는 왜 %esi이 문자열을 가리키는 지 잘 모르겠다. (이것은 어셈블러 설정에 익숙하지 않거나 우리에게 보여주지 않는 코드 행에 설정되어있다.) 즉, %esi은 문자열의 첫 번째 바이트 (이 경우에는 첫 번째 ["])에 "점"을 나타냅니다. %esi 레지스터를 사용하여 오프셋 (%esi + 5[o] 일 수 있음)을 사용하거나 레지스터 자체를 증가시켜 바이트를 반복 할 수 있습니다.

개행을 추가하려면 \n 대신 \x0D\x0A을 시도해보십시오.

+0

. 자열은 널 (NULL)로 종료됩니다. 그래서 당신의 기억은 다음과 같이 보입니다 : [ "] [H] [e] [l] [l] [o] [r] [l] [d] ["0] – beardhatcode

1
  1. 단지 코드/데이터 섹션에 일련의 문자를 방출합니다. thisthis을 참조하십시오 (비록 그들은 .ascii을 사용합니다).
  2. 코드를 보여주십시오.
  3. \\ n 또는 \ 12 또는 \ xa를 시도하십시오.