2 개의 16 비트 부호없는 레지스터를 비교하고 첫 번째 것이 더 큰 경우 내용을 바꾸고 싶습니다. 예를 들어 ax
에 00FF가 포함되고 bx
에 FFFF가 포함 된 경우 해당 내용을 교환하고 싶습니다. 이 작업을 수행하는 명령이나 스와핑에 사용되는 간단한 절차가 있습니까?x86 - 2 레지스터의 내용을 교환하십시오.
답변
"x86 - 2 개 레지스터의 내용 교환"입니다. 이 경우에는 도끼에 점프를 방지하려면 이미 큰 값을 보유
.model small
.stack 100h
.data
.code
mov ax, @data
mov ds, ax
mov ax, 0ffffh
mov bx, 0ffh
cmp ax, bx
ja swap ;IF AX > BX...
jmp continue
swap:
xchg ax, bx ;◄■■■ AX BECOMES 0FFH, BX BECOMES 0FFFFH.
continue:
mov ax, 4c00h
int 21h
그 제목 일지 모르지만 그 질문 자체는 분명합니다. (예를 든 OP를 포함하여) : _ 16 비트 부호없는 레지스터 2 개를 비교하고 첫 번째 것이 더 큰 경우 내용을 바꿉니다. –
@MichaelPetch, 간단합니다. 고치다. –
(당신은 그것을 것 대부분의 시간, 그리고 당신이 점프에 의한 지시를 피하려는 것을 알고있다 : 당신은 XCHG
명령, 예를 사용할 수 있습니다 파이프 라인은 CPU 구현에 따라 발생할 수있는 리필 ...), 아니면 그냥 바이트 (XCHG 도끼를 저장하려면, BX는 단일 바이트 연산 코드)입니다 : 내가 아는 한
cmp ax, bx
jb bx_is_bigger
xchg ax, bx
bx_is_bigger:
xchg ax, bx
더 나은 :'xchg'를 건너 뛰는'jnb', 그래서'xchg'는 2 번 또는 1 번보다는 0 번 또는 1 번 실행됩니다. 속도를 최적화하는 경우 실제로 교체 할 필요가 없도록하는 것이 좋습니다. 예 : 'ax'와'bx'에 넣기 전에'dx'와'ax'에 넣었을 것입니다. 그래서'mov '명령 두 개를 건너 뛰면됩니다. ('xchg'는 3uops로 디코드되므로 최신 CPU의 3'mx' 명령과 거의 같습니다). 일반적으로 [code golf] (https://codegolf.stackexchange.com/questions/77270/greatest-common-divisor/77364#77364) 또는 순전히 코드 크기의 상황에서 사용하지 않는 것이 좋습니다. –
- 1. x86 레지스터의 이름이 원래대로입니까?
- 2. 32 비트 레지스터의 하위 섹션을 명확히합니다. x86
- 3. 어셈블리의 배열 내용을 역순으로 교환하십시오.
- 4. 왜 x86 int 레지스터의 수가 8입니까?
- 5. 블록 단위로 파일 블록의 내용을 반대로 교환하십시오.
- 6. x86 레지스터의 NSString 출력을 NSArray로 변환하는 가장 좋은 방법
- 7. 2 개의 다른 AtomicReferences에서 2 개의 값을 교환하십시오.
- 8. IP 레지스터의 내용 표시
- 9. 32 비트 레지스터의 내용을 바이트 배열에 넣는 방법은 무엇입니까?
- 10. 레지스터 내용을 x86_64의 다른 레지스터의 메모리 주소로 이동
- 11. Macvim : 붙여 넣기 전에 클립 보드 레지스터의 내용을 수정하십시오.
- 12. 레지스터의 내용을 메모리의 변수로 지정된 주소에 저장하는 방법은 무엇입니까?
- 13. EAX 레지스터의 위쪽 절반 얻기
- 14. 반응 형 디자인 divs에 CSS 클래스가있는 html divs 내용을 교환하십시오
- 15. XMM 레지스터의 값을 인쇄하십시오.
- 16. 비트 레지스터의 포인터 레지스터
- 17. 사용자 선택에 따라 2 li의 내용을 바꿉니다
- 18. wxpython과 클래스간에 변수를 교환하십시오.
- 19. javascript : DOM 노드를 교환하십시오.
- 20. interop으로 Excel datagridview를 교환하십시오.
- 21. android의 버튼 위치를 교환하십시오
- 22. 레지스터의 홀수 비트를 미러링
- 23. 레지스터의 함수 인수
- 24. 레지스터의 ptrace watchpoint
- 25. VHDL 레지스터의 지연
- 26. AVX 레지스터의 불법 콘텐츠
- 27. x86 - 메모리 검사하기
- 28. 2 UIWebViews 내용을 전환
- 29. 복사 내용을 2 줄로보기
- 30. 시스템 호출시 코드 세그먼트 레지스터의 역할
, 아니 없다 이것을하는 단일 명령. 그냥'cmp''jb''xchg' –
'cmovCC' 명령을 사용할 수도 있습니다. – fuz
Aaron, 귀하의 질문에 대한 답변이 있습니다. –