2016-10-25 6 views
0

2 개의 16 비트 부호없는 레지스터를 비교하고 첫 번째 것이 더 큰 경우 내용을 바꾸고 싶습니다. 예를 들어 ax에 00FF가 포함되고 bx에 FFFF가 포함 된 경우 해당 내용을 교환하고 싶습니다. 이 작업을 수행하는 명령이나 스와핑에 사용되는 간단한 절차가 있습니까?x86 - 2 레지스터의 내용을 교환하십시오.

+4

, 아니 없다 이것을하는 단일 명령. 그냥'cmp''jb''xchg' –

+1

'cmovCC' 명령을 사용할 수도 있습니다. – fuz

+0

Aaron, 귀하의 질문에 대한 답변이 있습니다. –

답변

0

"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 
+1

그 제목 일지 모르지만 그 질문 자체는 분명합니다. (예를 든 OP를 포함하여) : _ 16 비트 부호없는 레지스터 2 개를 비교하고 첫 번째 것이 더 큰 경우 내용을 바꿉니다. –

+0

@MichaelPetch, 간단합니다. 고치다. –

0

(당신은 그것을 것 대부분의 시간, 그리고 당신이 점프에 의한 지시를 피하려는 것을 알고있다 : 당신은 XCHG 명령, 예를 사용할 수 있습니다 파이프 라인은 CPU 구현에 따라 발생할 수있는 리필 ...), 아니면 그냥 바이트 (XCHG 도끼를 저장하려면, BX는 단일 바이트 연산 코드)입니다 : 내가 아는 한

cmp ax, bx 
    jb bx_is_bigger 
    xchg ax, bx 
bx_is_bigger: 
    xchg ax, bx 
+0

더 나은 :'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) 또는 순전히 코드 크기의 상황에서 사용하지 않는 것이 좋습니다. –

관련 문제