2011-12-16 3 views
0

printf를 호출하여 어셈블리에서 문자열을 인쇄하려고합니다. 어셈블리 printf - 문자열의 첫 번째 문자 만 출력합니다.

내 어셈블리 코드 :. 그러나

mov dword[ebx + 0], '"' 
mov dword[ebx + 4], 'h' 
mov dword[ebx + 8], 'e' 
mov dword[ebx + 12], 'l' 
mov dword[ebx + 16], 'l' 
mov dword[ebx + 20], 'o' 
mov dword[ebx + 24], '"' 
mov dword[ebx + 28], 0 
push ebx 
push formatString 
call printf 
add esp, 8 
... 
formatString db '%s', 10, 0 

나는이 단지 첫 번째 문자 인쇄 실행 - ' "'가 아니라 전체 단어 ("안녕하세요 ")를

많은 감사

답변

5

내 어셈블리가 녹슬지 만 바이트 단위의 움직임이 있어야합니다. printf%s을 기다리고 있으므로 바이트 배열이 필요합니다. 메모리의 문자열은 아마도 "\0\0\0h\0\0\0e\0\0\0l\0\0\0l\0\0\0o\0\0\0"\0\0\0\0\0\0\0입니다.

이 주소 0x123456 임 포함 된 경우
mov dword[ebx + 0], '"'  ; moves the 32-bit value 0x22000000 to EBX 
mov dword[ebx + 4], 'h'  ; moves the 32-bit value 0x68000000 to EBX + 4 
... 

그래서, 당신은 메모리에 다음과 같은 일을 할 것이다 :

| 22 00 00 00 68 00 00 00 65 00 00 00 6c 00 00 00 | "...h...e...l... | 
| 6c 00 00 00 6f 00 00 00 22 00 00 00 00 00 00 00 | l...o..."....... | 

비록 당신이 주소로 printf으로 0x123456 임을 통과 되더라도, 그것은 단지를보고있다 단일 문자가 첫 번째 NUL 바이트에 도달하기 전에 다음은 작동합니다 :

mov dword[ebx + 0], 577267052 ; 0x2268656c = "hel 
mov dword[ebx + 4], 1819222528 ; 0x6c6f2200 = lo"\0 
push ebx 
push formatString 
call printf 
add esp, 8 

것은이 아마 ebx에 따라 간접 주소로 바이트를로드 할 수있는 더 나은 방법입니다하지만 난 셀 수보다 더 많은 년에 조립 보았다하지 않았습니다.

+0

그러나 printf에 char *를 기대하는 두 번째 매개 변수가 없습니까? 이것이 ebx에서 제공하는 것입니까? – user973758

+0

예. 'ebx'는 메모리에있는 바이트 배열 *의 주소입니다. 문제는 일련의'dword'를 메모리에로드하는 것입니다. –

+0

아아, 고마워. – user973758

관련 문제