2015-01-21 4 views
1

NASM 어셈블리에는 데이터 선언을위한 의사 지침 dbdw이 있습니다. NASM Manual은 두 가지 예를 제공하지만 그 차이점을 직접 말하지는 않습니다. 난 둘 다와 함께 다음과 같은 "안녕하세요 세상"코드를 시도하고 아무 차이가 관찰 할 수없는 것으로 밝혀졌다. 뚜렷한 점이 내부 데이터 형식과 관련이 있다고 생각하지만이를 조사하는 방법을 모르겠습니다.문자열 정의시 db와 dw의 차이

section .data 
     msg db "hello world",10,13,0 
     msg2 dw "hello world",10,13,0 

section .text 
global _start 
_start: 
     mov rax, 1 
     mov rdi, 1 
     mov rsi, msg ; or use msg2 
     mov rdx, 14 
     syscall 
     jmp .exit 

.exit: 
     mov rax, 60 
     mov rdi, 0 
     syscall 
+0

[문자열을 바이트 (db)로 정의하고 문자열을 단어/더블 워드 (dw/dd)로 정의하는 것과 x86의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/28003668/what- db-and-defining-string의 차이를 정의하는 것 사이) – Jester

답변

2

은 NASM 여하튼 ;-)

dw 'a'dw 0x61에 해당 단어를 생성하고, 워드 0x0061 61 00 (리틀 엔디안)과 같은 (빅 엔디안)를 저장한다.
dw 'ab' (리틀 엔디안)은 dw 0x6261 (빅 엔디안)과 같으며 61 62 (리틀 엔디안)을 저장합니다.
dw 'abc' (1 단어, 1 바이트)는 dw 0x6261, 0x63과 같으며 두 단어 (리틀 엔디안) : 61 62 63 00을 저장합니다.
dw 'abcd' (2 단어)에는 61 62 63 64의 두 단어가 저장됩니다.

msg2 dw "hello world",10,13,0은 문자열을 6 단어로 변환하고 숫자를 3 단어로 변환하여 저장합니다 (68 65 6C 6C 6F 20 77 6F 72 6C 64 00 0A 00 0D 00). 예에서 msg는 끝날 때까지 인쇄되지 않습니다.

+0

크고 작은 엔디안이 NASM의 문자열 변수 선언에 영향을 줍니까? 나는 일주일 전에 그것을 시험해 보았습니다. 그리고 정확하게 기억할 때 엔디 언니 스가 없습니다. – Blechdose

+0

@Blechdose : 문자열 뒤에 나오는 '00'의 존재/부재에 대한 설명을 찾고 있었는데 이것이 내 마음에 들었던 유일한 것입니다 :-) – rkhb

1

NASM 매뉴얼 섹션 3.2.1 DB and Friends: Declaring Initialized Data3.4.2 Character Strings은 개별 문자열이 요소 크기보다 짧을 때 차이가 있음을 나타냅니다. 이것은 더 큰 DD 더블 워드 초기화 의사 명령어에서 가장 두드러집니다. 각 요소의 요소 크기는 0 바이트로 채워집니다.

데이터에 의도하지 않은 문자가 없도록하려면 항상 8 비트 문자열로 DB를 사용하십시오. DW는 기계 바이트 순서 및 코드의 가정에 따라 UTF-16에서 작동하거나 작동하지 않을 수 있습니다.

두 문자열 항목의 길이가 같지 않아 두 선언의 내부 표현이 동일하지 않은 것이 거의 확실합니다.

2.1.3 The -l Option: Generating a Listing File을 사용하면 생성중인 콘텐츠를보기 위해 출력되는 실제 이미지를 볼 수 있습니다.