2017-11-07 11 views
0

나는 파일을 분석하고 그 정보 (이름과 크기)를 파일에 출력하는 어셈블러 프로그램을 작성 중이다. 기본적으로 4Eh 및 4Eh 인터럽트를 사용하여 파일을 검색합니다. 둘 다 DTA 개체를 해당 파일에 대한 정보와 함께 반환합니다.32 비트 파일 크기를 16 비트 사용자 입력과 비교합니까?

16 비트 사용자 입력 크기와 비교해야하는 32 비트 파일 크기를 반환합니다 (지정된 사용자 입력 크기보다 크면 파일 정보 만 출력해야합니다).

명백한 문제는 32 비트 숫자를 16 비트 숫자로 변환하는 방법을 모르겠다. 그렇지 않으면 내가 비교할 수 없기 때문이다. 누군가이 변환을 수행하는 방법을 알고 있거나이 비교를 구현하는 방법에 대한 다른 아이디어가 있습니까?

가능하면, 아마도 누군가가 당신 거꾸로 그것에 대해 생각하고 TASM 인텔 x86 어셈블리에있는 예제 코드

+0

분명히 파일 크기의 상위 16 비트가 0이 아닌 경우 사용자 입력보다 더 큰 숫자입니다. 숫자가 0이면 두 개의 16 비트 숫자를 비교할 수 있습니다. 쉬운. – Jester

+0

범위 0..65535의 값은 16 비트에 맞습니다 (상위 16 비트는 0입니다). 65536+ 값은 상위 16 비트에서 일부 비 제로 비트를 갖습니다. 앱이 16 비트 값 (0..65535) 만 입력으로받은 경우 상위 16 비트를 검사하여 길이가 65536 이상인지 먼저 확인할 수 있습니다. – Ped7g

답변

0

을 제공 할 수있다.

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/jzcmp/jb, 특히 32 비트 숫자가 메모리에있는 경우 단지 상위 16 비트를 무시함으로써 절단 :> 16 32 변환하는 것은 간단하다


(즉, 덜 효율적 당신은 메모리 대상과 sbb을 사용하지 않습니다.). 그러나 당신은 당신이 원하는 것을하지 않는다는 것을 이미 깨달은 것 같습니다.

dx : ax의 32 비트 정수를 cx의 16 비트 정수로 변환하려면 다음 명령을 사용하십시오. mov cx, ax.

+0

같은 의미에서 8 비트와 32 비트를 비교할 수 있습니까? 나는 32 비트 숫자를 4 개의 8 비트 숫자 (두 개의 높은 부분, 두 개의 낮은 부분)로 나눌 경우, 높은 부분이나 가장 낮은 부분의 왼쪽 부분에 0이 아닌 숫자가 있으면 그 수가 더 높다고 가정 할 수 있습니다. 어떤 8 비트 숫자보다. 그리고 그렇지 않으면, 나는 32 비트 숫자의 오른쪽 가장 낮은 부분과 8 비트 숫자 사이의 비교를 할 수 있습니다. –

+0

@ JonasPetraška : 예,하지만 한 단계에서 32 비트 숫자의 상위 16을 확인할 수 있습니다. 왜냐하면 8086이 16 비트 아키텍처이기 때문입니다.'movzx' (386) 또는'xor ax, ax' /'mov al, single_byte'를 사용하여 8 비트 수를 16으로 제로로 확장 한 다음 16 비트를 16 비트로 할 수 있습니다. 32 비트 숫자 –

+0

@PeterCorder : 대단히 감사합니다! –