문제

저는 Richard C.가 쓴 "80x86 어셈블리 언어 및 컴퓨터 아키텍처 소개"라는 제목의 교과서를 읽고 있습니다.Detmer는 59페이지에 다음과 같이 설명합니다. 바이트 어셈블리 언어의 지시어를 문자와 문자열에 사용합니다.텍스트는 다음과 같습니다.

"숫자 피연산자 외에도 바이트 지시문은 단일 문자를 포함하는 문자 피연산자 또는 여러 문자를 포함하는 문자열 피연산자를 허용합니다.아포스트로피(') 또는 따옴표(")를 사용하여 문자를 지정하거나 문자열을 구분할 수 있습니다.쌍으로 이루어져야 합니다.왼쪽에는 아포스트로피를, 오른쪽에는 따옴표를 넣을 수 없습니다.아포스트로피로 구분된 문자열에는 따옴표가 포함될 수 있고, 따옴표로 구분된 문자열에는 아포스트로피가 포함될 수 있으므로 이러한 특수 문자가 포함된 문자열이 있을 수 있습니다.

이것은 매우 이해할 수 있지만 내 호기심 라인은 바이트 지시문은 1바이트, 8비트만 담을 수 있다고 생각했기 때문입니다.테스트를 해봤는데 이렇게 말하면

string BYTE "HelloWorld"

물론 컴파일되지만 16진수를 확인하면 단일 바이트가 아니라 여러 바이트라는 것을 알 수 있습니다.ASCII 테이블을 보면 우리는 이미 단일 문자가 바이트라는 것을 알고 있습니다.그렇다면 어떻게 문자열을 가질 수 있을까요?이것을 숫자에 적용해 보았습니다.우리는 범위를 알고 있습니다. 바이트 지시어는 -128부터 255까지입니다.나는 이 코드를 시도했다:

number BYTE 9987

컴파일하고 실행하려고 하면 당연히 9987이 1바이트보다 크기 때문에 오류가 발생합니다.그런데 왜 문자열은 이에 면역이 되는 걸까요?왜 그럴 수 있는가? 바이트 지시문은 문자열 컨텍스트에서 1바이트 이상을 유지하지만 숫자에서는 동일하지 않습니까?

제가 나열한 첫 번째 코드 문을 컴파일하고 실행했을 때 두 번째 코드 문과 동일한 오류가 발생했다고 상상해 보겠습니다.여기서 "규칙"이 깨진 이유는 무엇입니까?

-단

도움이 되었습니까?

해결책

단일 어셈블러 구문은 없으며, 다른 프로그램은 다른 구문을 사용할 수 있습니다.조립 설명서를 참조해야 합니다.

즉, 문자열 상수는 일반적으로 각 문자를 개별적으로 간략하게 표기한 것입니다. BYTE 지시문을 사용하면 여러 항목을 한 번에 정의할 수 있습니다.

예를 들어, BYTE 1, 2, 3, 4 유효하며 4바이트를 정의합니다. string BYTE "HelloWorld" 는 다음과 같습니다 string BYTE 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' 10바이트를 정의합니다.오류가 발생하지 않는 이유는 각 문자 자체가 바이트에 맞기 때문입니다.

일부 어셈블러에서는 문자열 리터럴도 허용하지 않습니다. BYTE 또는 이에 상응하는 지시어에는 문자열에 대한 특수 지시어가 있습니다. 예를 들어 .string 또는 .ascii.

다른 팁

BYTE 지시문은 어셈블러가 스토리지 블록을 예약하고 길이를 바이트 단위로 기억하도록 어셈블러에 알려줍니다. 길이는 초기화 자의 바이트 수에 의해 결정되며, 이는 0-255 개의 십진수 또는 작은 따옴표로 문자가 될 수 있습니다. 문자열은 프로그래밍 언어에서 공통적이며 일반적으로 메모리의 연속 바이트의 문자 배열로 간주됩니다. 프로그래머의 편의성으로 단일 또는 큰 따옴표로 문자열을 지정하여 문자열로 초기화 된 일련의 바이트를 예약 할 수 있습니다. 이들은 동등한

입니다
string1 BYTE 'H', 'e', 'l', 'l', 'o'
.

또는

string1 BYTE 'Hello'
.

일부 조립자는 이에 대해 다른 지시문이 있습니다. 예를 들어 Oracle Solaris X86 어셈블리 언어가있는

  • bytes
  • 를 취하는
  • .byte 지시문
  • .ascii nul 종료되지 않은 문자열을 가져 오는 문자열
  • .string will가 nul 종료 된 문자열을 취하는
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top