Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 8086汇编程序:比较两个无符号整数并将AX设置为1(真)或0(假)_Assembly_X86_X86 16 - Fatal编程技术网

Assembly 8086汇编程序:比较两个无符号整数并将AX设置为1(真)或0(假)

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

我正在编写一个古老的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    ; 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