을 제공 할 수있다.
16 비트 수를 32로 제로로 확장하고 32 비트 비교를 수행하려고합니다. (C에서 서로 다른 유형의 작업은 거의 항상 원하는대로 수행되기 때문에 두 유형을 모두 지원할 수있는 유형으로 승격됩니다.)
Jester가 설명했듯이 이는 사용자 입력의 상위 16 개가 항상 0이고, extended-precision/BigInteger 비교의 상반부를 수행하는 것은 단순히 파일 크기의 상반부가 0이 아닌지 확인하는 것입니다. 그런 다음 파일 크기가 16 비트 사용자 입력보다 낮을 정도로 작 으면 하위 절반을 임계 값과 비교하십시오.
또한보다 적게보다는 하나의 분기 명령과
로가 확장 된 정밀 빼기 일을 확인할 수 있습니다
:
file_loop: ; do {
load a new file size
;; file size in dx:ax, threshold in cx
cmp ax, cx ; low half (non-destructive: cmp = sub but without writing ax)
sbb dx, 0 ; high half. (destructive)
; ZF reflects only the high-half compare result
; CF is useful (and so are SF/OF for signed compare).
; Avoid JCC conditions that depend on ZF, like JA.
jnb file_loop ; } while(CF==0); (JNB = JNC)
;;; dx:ax < 0:cx unsigned was true.
;;; So we know the original DX was 0 (and is now 0xFFFF)
;;; AX = the file size (which we didn't destroy), and we know it fits in 16 bits.
do something with this file
jmp file_loop
이 좋은 컴팩트, 그러나 아마 특히보다 나은 cmp/jz
및 cmp/jb
, 특히 32 비트 숫자가 메모리에있는 경우 단지 상위 16 비트를 무시함으로써 절단 :> 16 32 변환하는 것은 간단하다
(즉, 덜 효율적 당신은 메모리 대상과 sbb
을 사용하지 않습니다.). 그러나 당신은 당신이 원하는 것을하지 않는다는 것을 이미 깨달은 것 같습니다.
dx : ax의 32 비트 정수를 cx의 16 비트 정수로 변환하려면 다음 명령을 사용하십시오. mov cx, ax
.
분명히 파일 크기의 상위 16 비트가 0이 아닌 경우 사용자 입력보다 더 큰 숫자입니다. 숫자가 0이면 두 개의 16 비트 숫자를 비교할 수 있습니다. 쉬운. – Jester
범위 0..65535의 값은 16 비트에 맞습니다 (상위 16 비트는 0입니다). 65536+ 값은 상위 16 비트에서 일부 비 제로 비트를 갖습니다. 앱이 16 비트 값 (0..65535) 만 입력으로받은 경우 상위 16 비트를 검사하여 길이가 65536 이상인지 먼저 확인할 수 있습니다. – Ped7g