将32位文件大小与16位用户输入进行比较?

时间:2017-11-07 15:27:00

标签: assembly x86 tasm

我正在编写汇编程序,它分析文件并将其信息(名称和大小)输出到文件中。我基本上使用4Eh和4Eh中断来搜索文件:它们都返回DTA对象,其中包含有关该文件的相关信息。

它返回一个32位的文件大小,我必须与16位用户输入的大小进行比较(如果它大于给定的用户输入大小,我必须输出文件信息)。

这里显而易见的问题是我不知道如何将32位数转换为16位数,因为否则我无法比较它们。也许有人知道如何执行此转换或对如何实现此比较有任何其他想法?

如果可能,也许有人可以在TASM Intel x86程序集中提供示例代码

1 个答案:

答案 0 :(得分:0)

你正在考虑倒退。

您希望将16位数字零扩展为32,并进行32位比较。 (在C语言中,对不同类型的操作会提升到足以容纳它们的类型,因为这几乎总是你想要的。)

正如Jester所解释的,这意味着用户输入的高16位始终为零,因此进行扩展精度/ BigInteger比较的上半部分只是检查文件大小的上半部分是否为非零。然后,如果文件大小足够小,可能低于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位数字在内存中。 (您不希望将sbb与内存目标一起使用;效率较低。)

转换32-> 16是微不足道的:只是通过忽略高16位来截断。但你似乎已经意识到不会做你想做的事。

要回答旧标题:要将dx:ax中的32位整数转换为cx中的16位整数,请使用以下指令:mov cx, ax