我正在编写汇编程序,它分析文件并将其信息(名称和大小)输出到文件中。我基本上使用4Eh和4Eh中断来搜索文件:它们都返回DTA对象,其中包含有关该文件的相关信息。
它返回一个32位的文件大小,我必须与16位用户输入的大小进行比较(如果它大于给定的用户输入大小,我必须输出文件信息)。
这里显而易见的问题是我不知道如何将32位数转换为16位数,因为否则我无法比较它们。也许有人知道如何执行此转换或对如何实现此比较有任何其他想法?
如果可能,也许有人可以在TASM Intel x86程序集中提供示例代码
答案 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/jz
和cmp/jb
特别好,特别是如果32位数字在内存中。 (您不希望将sbb
与内存目标一起使用;效率较低。)
转换32-> 16是微不足道的:只是通过忽略高16位来截断。但你似乎已经意识到不会做你想做的事。
要回答旧标题:要将dx:ax中的32位整数转换为cx中的16位整数,请使用以下指令:mov cx, ax
。