Assembly 8086汇编程序:比较两个无符号整数并将AX设置为1(真)或0(假)
我正在编写一个古老的Turbo Pascal v.3 8086编译器的克隆。我想比较两个无符号整数,如果它们相等,则设置ax=1(true),否则设置ax=0(false) 根据声明Assembly 8086汇编程序:比较两个无符号整数并将AX设置为1(真)或0(假),assembly,x86,x86-16,Assembly,X86,X86 16,我正在编写一个古老的Turbo Pascal v.3 8086编译器的克隆。我想比较两个无符号整数,如果它们相等,则设置ax=1(true),否则设置ax=0(false) 根据声明 bool:=1=2; 涡轮帕斯卡发射 mov ax,1 ; argument 1 cmp ax,2 ; argument 2 mov ax,1 ; 1 = true jz L1 ; arguments are equal, ax=1 dec ax ; argume
bool:=1=2;
涡轮帕斯卡发射
mov ax,1 ; argument 1
cmp ax,2 ; argument 2
mov ax,1 ; 1 = true
jz L1 ; arguments are equal, ax=1
dec ax ; arguments are not equal, ax=0
L1:
mov bool,ax
是的,它很管用,但看起来很笨拙。在8086中有更好的方法吗?在386+上使用指令
setz
可以进行不断的折叠,并消除除mov bool,0
指令之外的所有内容。@RossRidge给定的程序集就是为top语句生成的。在一般情况下,它将无法受益于常量折叠在一般情况下,原始海报编译器应该执行常量折叠。这是一个更一般的优化,而不是像Egor Skriptunoff的回答那样,用特定的代码改进为一个非常特定的语句生成的代码。你们都是对的。我设计的示例不应该使用文字常量(头脑正常的人都不会写bool:=1=2)。注意埃戈尔·斯克里普托诺夫在回答中使用了论证1和论证2。这个问题不是关于编译器优化的:“8086汇编程序:比较两个无符号整数并将AX设置为1(真)或0(假)”。比较后将布尔变量设置为0或1是非常常见的。Turbo Pascal生成了非常非常糟糕的代码。即使是BP7(1992年底发布)也会产生几乎相同的代码,只是将结果存储为字节而不是单词。在386+上,使用指令setz
可以不断折叠并消除除mov bool,0
指令之外的所有内容。@RossRidge给定的程序集就是为top语句生成的。在一般情况下,它将无法受益于常量折叠在一般情况下,原始海报编译器应该执行常量折叠。这是一个更一般的优化,而不是像Egor Skriptunoff的回答那样,用特定的代码改进为一个非常特定的语句生成的代码。你们都是对的。我设计的示例不应该使用文字常量(头脑正常的人都不会写bool:=1=2)。注意埃戈尔·斯克里普托诺夫在回答中使用了论证1和论证2。这个问题不是关于编译器优化的:“8086汇编程序:比较两个无符号整数并将AX设置为1(真)或0(假)”。比较后将布尔变量设置为0或1是非常常见的。Turbo Pascal生成了非常非常糟糕的代码。即使是BP7(1992年底发布)也会产生几乎相同的代码,只是将结果存储为一个字节而不是一个字。非常酷!您的代码和原始代码都是12字节,因此没有大小改进,但应该更快。我知道循环计数是有问题的,但是我为原始代码提出了18或30个循环,这取决于是否使用了分支,而您的分支是17个,所以看起来您应该总是赢。另外,因为你的代码没有分支,所以它不会杀死预取队列。非常酷!您的代码和原始代码都是12字节,因此没有大小改进,但应该更快。我知道循环计数是有问题的,但是我为原始代码提出了18或30个循环,这取决于是否使用了分支,而您的分支是17个,所以看起来您应该总是赢。此外,由于代码没有分支,因此不会终止预取队列。
mov ax,argument1
sub ax,argument2
add ax,-1
sbb ax,ax
inc ax
mov bool,ax