2013-08-11 4 views
0

어셈블리에서 코딩하는 것이 좋지 않습니다. 어쨌든 여기에 어셈블리로 작성해야합니다. 각 문자를 볼 수 또는 바이트가 널 바이트로 구분되기 때문에, 단지, "1"한 바이트를 표시 할 수 있습니다 대신 "123"16 진수를 문자열로 읽는 것

경우에만

.data 
     Msg db 31h, 00h, 32h, 00h, 33h ;convert this to string which "123" 

    .code 

    start: 

     invoke MessageBox, 0, addr Msg, 0, 0 
     call ExitProcess 
    end start 

(I는 MASM32 사용하고 있습니다) 문자열의 끝에 도달 할 때까지 각 읽을 수있는 바이트를 연결할 수 있습니다.

mov ebx, offset Msg 
mov ecx, ebx 
add ebx, 2 
invoke lstrcat, ebx, ecx 

는 어쩌면 난 그냥 코딩 할 수있는 더 좋은 방법을 모르거나 당신이 더 나은 솔루션이 있다면 당신은 공유 할 수 있습니다, 또한 루프를 추가 할 수 있습니다.

+0

유니 코드처럼 보였 겠지만 홀수 개의 바이트가 있습니다 (마지막 바이트에는 '00'이 없음). 그게 전사 오류인가요? – lurker

+0

어셈블리에서 Windows 프로그래밍을하는 이유는 무엇입니까? [Steve Gibson] (https://www.grc.com/smgassembly.htm)과 통화 했습니까? –

답변

0

문자열에서 작업하려면 문자열의 길이를 알아야합니다. 이것은 NULL을 사용하여 문자열을 종료함으로써 수행됩니다. 문자열 길이를 인수로 취하지 않는 함수는 00H를 찾아서 MessageBox가 수행하는 문자열 인 "1"을 인쇄하고 다음 문자가 00h 인 것을보고 인쇄를 중단합니다.

문자열 끝 부분에 NULL 종결자가없는 경우 위치 카운터의 현재 값인 "$"기호를 사용하여 어셈블리 시간에 문자열 길이를 얻을 수 있습니다. 의미

Msg   db 31h, 00h, 32h, 00h, 33h ;convert this to string which "123" 
Msg_Len  equ $ - Msg 

는 $의 주소를 가지고 메시지의 주소를 빼기, 그 값으로 Msg_Len을 교체합니다.

include masm32rt.inc 

.data 
Msg   db 31h, 00h, 32h, 00h, 33h ;convert this to string which "123" 
Msg_Len  equ $ - Msg 

.data? 
Msg_New  db Msg_Len + 1 dup (?) 

.code 
start: 

    xor  ecx, ecx    ; index into source array 
    xor  edx, edx    ; index into dest array 
    lea  esi, Msg 
    lea  edi, Msg_New 
ConvertIt: 
    mov  al, byte ptr[esi + ecx] ; get byte at pointer + index 
    cmp  al, 0     ; is it a 0? 
    jne  @F      ; no, add it to dest array 
    inc  ecx      ; yes, increase source index 
    jmp  CheckForEnd    ; check to see if at end 

@@: 
    mov  byte ptr [edi + edx], al; add byte to dest array 
    inc  ecx      ; increase both indexes 
    inc  edx      ; 

CheckForEnd: 
    cmp  ecx, Msg_Len   ; check for end - if ecx == Msg_Len we are done 
    jne  ConvertIt    ; if ecx != Msg_Len, continue loop 

    mov  byte ptr [edi + edx], 0 ; don't forget to NULL terminate dest string 

    invoke MessageBox, HWND_DESKTOP, offset Msg_New, NULL, MB_OK 
    invoke ExitProcess, 0 
end start 

은 적은 코드와 "장소", "변환"문자열로 수행 할 수 있지만, 여기서는 그 범위를 벗어납니다.

@Nik, 우리 중 일부는 어셈블리를 사랑하며 다른 것을 사용하지 않습니다.

관련 문제