복사 명령이 보통 MOV라는 이유는 무엇입니까?


23

많은 어셈블러에서 값 복사 명령어는 일반적으로 "MOV"로 이름 지정되며 매뉴얼에 설명에는 일반적으로 "move"도 포함됩니다 (그러나 "load", "store", "extract"등과 같은 다른 단어를 사용할 수 있음). 이 규칙을 따르지 않는 ISA 를 찾는 것은 드문 일 입니다.

반면에 다른 상황에서 "move"는 소스가 파괴된다는 점에서 "copy"와 다릅니다 (예 : Unix의 "mv"대 "cp", Norton Commander의 Move [F6] 및 클론 등). ) 어셈블러의 "이동"에는 실제로 의미 상 "복사"가있어 소스 값을 그대로 유지합니다.

필자는 이것이 IBM 1401 (1959) 이후로 시작된 것을 발견 했지만 IBM 360 은이 단어를 인-스토리지 복사에만 사용했지만 레지스터와 스토리지 ( "로드"및 "스토어"사용) 간의 조작에는이 단어를 사용하지 않았습니다. . 그러나 왜 여전히 널리 사용되고 "복사"또는 "저장소"로 대체되지 않습니까?


5
위키피디아의 말 : "이 작업에 대한 단어 이동은 엄밀히 말하면 오해입니다. 객체를 A에서 B로 옮기고 장소 A를 비운 다음 물리적 인 개념과는 거의 관련이 없습니다. 대신 MOV는 이 프로세스에서 A의 객체 상태를 이전 B의 상태를 덮어 씁니다. 이것은 이동 대신 load , store 또는 copy 같은 단어를 사용하여 다른 어셈블리 언어에 반영됩니다 . "
Uwe Keim

@UweKeim 흠, 질문 전에 설명을 봤지만이 기사는 제공되지 않았습니다. 어쨌든 이것은 현재 상태를 설명하지만 실제 원산지에 대한 단서를 제공하지 않습니다 ...
Netch

2
@gnat 저는 ISA 버스가 아니라 "명령어 세트 아키텍처"를 의미했습니다. 다시 편집했습니다.
Netch

@Netch 감사합니다! 나는 어떻게 든 Wikipedia
gnat

1
왜 원래 "복사"대신 "이동"이라고 불렀는지 알 수있는 방법이 있을지 모르겠지만 추측은 재미 있습니다. 온 어셈블리 언어에 대한 위키 피 디아 페이지 , 그것은 흥미로운 해석, "데이터의 사본을 이동"에 대한 작업으로 MOV를 설명합니다. 또 다른 가능성은 MOV의 실제 사용 측면에서 작업이 개념적으로 데이터 이동일 수 있습니다. 더 이상 소스에 신경 쓰지 않습니다.
Ben Lee

답변:


10

일부 명령어 세트에는 메모리에서 레지스터를로드하거나 레지스터를 메모리에 저장하거나 레지스터간에 사물을 전송하는 고유 한 명령어가 있습니다. 일부 어셈블리 언어 형태 모두를위한 동사 "로드"를 사용하는 동안 (예를 들어, 자일 로그의 Z80 니모닉 사용 ld a,(1234h), ld (1234h),ald a,b), 및 (예를 들어 "A에 전송 X"에 대한 TXA와 함께 6502) 일부 사용 "T"를 ransfer, 일부 사용 "이동" 등록 및 등록 작업이로드 및 저장과 구별되도록합니다. 레지스터 대 레지스터, 레지스터 대 메모리, 메모리 대 레지스터 및 심지어 메모리 대 메모리 작업에 동일한 일반 명령어 양식을 사용하는 68000과 같은 명령어 형식이있는 경우 동사 "이동"은 다음과 같습니다. 아마도 다른 대안보다 더 나은 범용 동사입니다.

8080 이전의 미니 컴퓨터 또는 메인 프레임 명령어 세트에 대해서는 전혀 모르지만 8080은 대부분의 메모리 액세스 명령어에 "로드"및 "저장"을 사용하고 레지스터 투 레지스터 명령어에는 "mov"를 사용했지만 대부분 작동 할 수있는 명령어는 임의의 8 비트 레지스터에서 HL이 주소를 지정한 메모리 위치 인 "M"에서도 작동 할 수 있으므로 "M"과 "M"사이의 "MOV"는 실제로로드 또는 저장으로 작동합니다.

"복사"와 "이동"의 차이점은 코드가 레지스터를 생성하거나 파괴 할 수 없다는 사실과 관련이 있다고 생각합니다. 그들은 단지 존재합니다. 코드 시퀀스의 동작을 설명 할 mov bx,ax / mov ax,1234때 첫 번째 명령이 bx를 ax로 복사한다고 말하는 것이 더 합리적이며 두 번째 명령은 값을 삭제하고 값을 ax1234로 대체하거나 첫 번째를 보는 것이 더 합리적입니까? bx에서 ax로 값을 옮긴 것으로 명령 (도끼의 값을 "무관심"으로 만드는)과 두 번째 명령은 1234로 ax (무관심)를로드합니까? 때때로 소스 레지스터는 레지스터 전송 명령어 이후에도 여전히 의미가 있지만, 명령어 세트에 소스 레지스터가 있는지 여부를 나타내는 것은 없기 때문에,


귀하의 답변을 뒷받침 할만한 증거는 없지만 확실히 잘 들립니다. 로드 / 저장 작업은 메모리 / 캐시로 인해 CPU / 마이크로 코드에서 다른 경로를 사용하지만 레지스터 간 이동은 단일주기 (다른 파이프 라인 단계에서 기다릴 필요가 없음) 일 수 있으므로 차별화 할 가치가 있습니다. 그러나 이것은 움직임 대 복사를 설명하지 않습니다 ...
JBRWilkinson

동의했다. 예를 들어 메모리 매핑 된 입력 장치를 고려하십시오. 소스 위치를 읽으면이를 수정할 수 있습니다. 예를 들어 하드웨어 큐에서 읽은 항목을 버리고 다음에 대기중인 항목으로 바꿉니다. 그것은 사본이 아니라 이동처럼 들립니다. 소스는 더 이상 해당 정보를 보유하지 않으며 대상 만 수행합니다. 그리고 그 행동은 CPU에 의해 결정되는 것이 아니라, 메모리 매핑 된 장치에 의해 결정됩니다.
Steve314

어셈블리 언어는 "CPU 중심"인 니모닉을 사용합니다. 즉, 모든 것은 CPU 레지스터의 관점에서 명명됩니다. 따라서 "로드"는 일반적으로 값을 레지스터로 복사하는 반면 "저장"은 일반적으로 레지스터에서 메모리로 값을 복사합니다. 그러면 한 레지스터에서 다른 레지스터로 값 복사를 호출하는 것은 무엇입니까? "이동"은 분명한 선택입니다. 68000에서와 같이 동일한 마이크로 코드 작업이 두 가지를 모두 수행하는 경우 "이동"이로드 / 저장을위한보다 일반적인 선택입니다. "복사"는 사용될 수 있었지만 소스가 비어있는 실제 "이동"과 같은 것은 없기 때문에 중복 될 수 있습니다.
DocSalvager

@DocSalvage : 32 비트 레지스터가 항상 존재하는 고정 된 32 개의 플립 플롭 또는 래치 무리 인 경우 "이동"이 반드시 의미가있는 것은 아닙니다. 그러나 레지스터 이름을 바꾸는 아키텍처에서는 소스를 무효화하는 "이동"피연산자가 가상 ​​레지스터를 해제하여 효율성을 향상시킬 수 있습니다. 그런 일을 한 적이 있지만 레지스터 이름 변경을 염두에두고 설계된 아키텍처는 알 수 없습니다 .
supercat

@supercat : 컴퓨터 하드웨어에서 모든 레지스터와 모든 메모리 위치는 항상 값을 포함합니다. 실제로 "null"또는 "empty"와 같은 것은 없습니다. 레지스터 또는 메모리 내용이 유효하지 않은 경우를 나타 내기 위해 임의의 규칙을 사용합니다. 종종 "0"이 "널"을 의미하지만 항상 그런 것은 아닙니다. 예를 들어 메모리 블록의 "널 (null)"상태는 다른 위치에 저장된 시작 및 끝 주소로 표시 될 수 있습니다. 다른 많은 기술들도 있습니다. 언어 니모닉은 궁극적으로 가장 널리 이해되는 옵션을 시도하지만 임의적입니다.
DocSalvager

0

당신은 확실히 맞습니다. mov 명령의 모든 인스턴스가 실제로는 사본이 아닌 경우가 대부분입니다.

일부는 실제로 mov를 가지고 있지 않습니다.

add dest=source+zero.

또한 ascii 구문은 임의적이며 기계 코드는 무언가를 의미하며 해당 프로세서에 대해 정의되고 수정되었습니다. 대부분의 경우 프로세서 제작자 / 공급 업체가 명령 집합 (기계 코드)을 정의하기 위해 부분적으로 구문을 생성하고 부분적으로 해당 어셈블리 언어를 기계로 변환하기 위해 생성하거나 시운전 한 도구와 작동하는 구문을 정의하기도합니다. 그들의 프로세서 코드. 예를 들어 gnu 어셈블러 (자체 작업을 수행하고 프로세서 공급 업체 구문을 따르지 않는 경향이 있음)로 복사 사본 의사 명령어를 추가 할 수 있습니다.

유스 케이스 : 요즘 대부분의 어셈블리 언어 코드는 컴파일러로 생성되며 mov 명령은 소스 레지스터 (메모리 위치 등)를 재사용 할 수 있도록 실제로 한 레지스터에서 다른 레지스터로 값을 이동하는 데 가장 자주 사용됩니다. 해당 프로세서의 호출 규칙 또는 일부 명령어 또는 명령어 세트가 직교하지 않기 때문에 사물을 이동해야합니다. 확실히 값의 사본이 필요한 경우가 있으며 mov를 사용하여 사본을 만들 수 있습니다.

우리는 개인이나 팀이 먼저 용어를 생각해 낸 이유와 그들이 왜 복제를 선택했는지 알 것입니다. 우리는 그것에 익숙해 졌기 때문에 새로운 명령어 세트마다 재사용하는 경향이 있습니다. 이미 언급했듯이 일부 명령어 세트는 레지스터 기반로드 및 저장 명령어를 사용합니다. 여기서 하나의 피연산자는 레지스터이고 다른 피연산자는 주소이며 레지스터는 레지스터 만 대소 문자를 등록합니다. 그리고 다른 명령어 세트는 레지스터에 mov를 사용하고 피연산자에 mem을 사용합니다. 오픈 소스 어셈블러의 일부 / 복수에 사본을 추가 할 수는 있지만 사용에 대한 견인력을 얻는 것이 더 어려울 것입니다. 레지스터를 이동하도록 레지스터를 지시 할 수있는 원래 구문을 제어 할 수있는 곳 (새 프로세서를 만드는 장소에 대한 작업)을 복사라고합니다.


-4

명령어를 교체한다는 것은 이전 버전과의 호환성을 깨뜨리는 것을 의미합니다. 새 구문을 사용하는 어셈블러는 이전 구문으로 작성된 코드를 어셈블 할 수 없습니다. 해당 코드가 해당 명령어를 사용하지 않는 경우 (및 사용하지 않는 어셈블리 코드가 표시되는 유일한 위치 MOV는 구문 예제) 다른 지침을 보여줍니다 ...)

컴파일러는 일반적으로 어셈블리 코드를 생성하여 자동으로 어셈블러에 전달하므로 새 어셈블러에 맞게 수정해야합니다. 언어가 인라인 어셈블리를 허용하는 경우 MOV명령 과 함께 인라인 어셈블러를 사용하는 이전 소스 코드는 더 이상 작동하지 않습니다.

우리는 거대한 코드 손상에 대해 이야기하고 있습니다. 일부 고급 언어와 달리 어셈블리를 몰라도 어셈블리 코드가 무엇인지 알 수 없으며 어셈블리를 아는 경우에는 무엇을 알 수 있기 때문에 언어를 더 읽기 쉽게 만들 수 없습니다 MOV.

게인이 0 인 막대한 비용으로 지침 이름이 바뀌지 않은 이유를 쉽게 설명 할 수 있습니다.


3
이것은 질문에 어떻게 대답합니까?
gnat

2
물음표로 끝나는 유일한 문장은 '왜 여전히 널리 사용되며 "복사"또는 "저장소"로 대체되지 않습니까?'입니다.
Idan Arye

2
수십 년에 걸쳐 처음부터 (즉, 이전 버전과의 호환성 제약 조건없이) 설계된 무수한 ISA에 의해 명령의 이름이 시작된 이유를 설명하지 않습니다. 또한 공급 업체가 이전 버전과의 호환성에도 불구하고 니모닉을 변경하려는 경우 별칭을 제공하고 사용을 촉진 할 수 있습니다.

1
"OP"는 무엇을 의미합니까? 그리고 나는 진짜 설명을 보지 못했습니다.
Netch

1
내가 원래 포스터 그리고 난 S / 360의 메모리 셀 사이의 복사를 기재하여야 것은 없다 "약간 다른 동작"하지만 같은 복사의 특별한 경우이다. 문제는 여전히 해결되지 않았습니다.
Netch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.