sobre a assembly CF (Carry) e OF (Overflow) flag

Sabe-se que o CF indica que o unsigned realiza e que o OF indica um overflow assinado. Então, como um programa de assembly diferencia entre dados não assinados e assinados, já que é apenas uma seqüência de bits? (Através de armazenamento de memory adicional para informações de tipo, ou através de informações de posição ou mais?) E esses dois sinalizadores poderiam ser usados ​​de forma intercambiável?

A distinção está em quais instruções são usadas para manipular os dados, não os dados em si. Os computadores modernos (desde 1970) usam uma representação de dados inteiros chamados de complemento de dois, nos quais a adição e a subtração funcionam exatamente da mesma forma em números assinados e não assinados.

  • A diferença na representação é a interpretação dada ao bit mais significativo (também chamado de bit de sinal ). Para números não assinados, o bit mais significativo é definido quando o número está na metade superior do intervalo totalmente positivo. Para números assinados, o bit mais significativo é definido quando o número está na metade inferior e negativa de todo o intervalo.

  • Instruções diferentes podem usar diferentes interpretações do mesmo bit. Por exemplo, a maioria das máquinas grandes tem instruções múltiplas e não assinadas. Máquinas com uma instrução ‘set less than’ podem ter sabores assinados e não assinados.

  • O OF (sinalizador de estouro) informa se um carry inverteu o sinal do bit mais significativo no resultado para que seja diferente dos bits mais significativos dos argumentos. Se os números forem interpretados como não assinados, o sinalizador de estouro é irrelevante, mas se forem interpretados como assinados, OF significa, por exemplo, dois grandes números positivos foram adicionados e o resultado foi negativo.

  • O CF (flag de transporte) informa se um bit foi executado da palavra inteiramente (por exemplo, no bit 33 ou no bit 65). Se os números forem interpretados como não assinados, transportar sinalizador significa que o acréscimo foi excedido e o resultado é muito grande para caber em uma palavra de máquina. O sinalizador de estouro é irrelevante.

A resposta à sua pergunta é que o código assembly tem várias maneiras de distinguir dados assinados de não assinados:

  • Pode escolher CF ou OF para fazer comparações assinadas ou não assinadas.
  • Pode escolher entre múltiplas ou não assinadas e dividir as instruções.
  • Pode escolher um deslocamento à direita assinado ou não assinado (assinado copia o bit alto; mudanças não assinadas em zeros).

Não tente opcode o sinal. Isso é impossível. Em vez disso, tente apenas perceber a verdade: não há sinal. Então você verá que não é o tipo de sinal que diferencia, é apenas você mesmo.

Existem diferentes opcodes para lidar com dados assinados e não assinados. Se um programa quiser comparar dois inteiros assinados, ele usará os opcodes jl , jle , jg e jge , em que l e g representam l e re respectivamente. Se um programa quiser comparar dois inteiros sem sinal, ele usará os opcodes jb , jbe , ja e jae , onde a e b representam um bove e bowow respectivamente. O e significa “ou igual a” em todos os casos. Esses opcodes são usados ​​para ramificação com base em uma comparação.

Da mesma forma, há também as instruções setCC , que definem um byte para 0 ou 1, dependendo de uma comparação. Eles funcionam de forma idêntica – há setl , setg , setge , setb , setbe , setbe , seta , setae e outros.

Os opcodes assinados testam as bandeiras ZF, OF e SF. Os opcodes não assinados testam as flags ZF, CF e SF. Veja as seções do Manual de Referência do Programador 80386 nas instruções do JCC e as instruções setCC para as condições exatas testadas.

Não faz. As bandeiras só ficam definidas sempre que a condição ocorre. O programador deve saber com que tipos de ints ele está trabalhando e de que saber qual bandeira examinar se ele se importa.

Não há como pedir à CPU para testar e retornar o tipo de byte / word / long.

0xFF pode conter “255” ou “-1” tudo depende do tipo de byte seu programa diz que é.

Construções como “type”, “signess” etc. existem apenas em linguagens de nível superior, como Java e não no nível da CPU. No final tudo é um byte para a CPU cabe aos nossos programas organizar e saber como interpretar e manipular esses valores …

Os sinalizadores de CPU encontrados no status não impõem nenhum paradigma que cabe ao seu código testar e reagir de acordo.

Nos processadores Intel, os registros MMX e FPU ocupam os mesmos registros. Dessa forma, é impossível misturar as instruções do tipo FPU e MMX ao mesmo tempo, porque os valores de uma operação estragarão o outro. Os programas que normalmente precisam concluir suas ações em um modo, por exemplo, emitem instruções de FPU e, em seguida, podem iniciar o MMX, mas nunca os dois ao mesmo tempo.

Normalmente, os programas de assembly não contêm informações especiais com variables ​​para indicar se estão assinados ou não. É o trabalho do programador saber quando verificar quais sinalizadores e quando usar quais condicionais (ou seja, usando JA em vez de JG).

Então você precisa saber com que tipo de variável você está prestes a trabalhar para saber quais comandos usar. É por isso que a maioria das linguagens de programação fornece avisos quando os programadores usam tipos assinados / não assinados de maneira intercambiável (isto é, sem uma conversão explícita), já que isso pode ser feito no hardware, mas pode gerar resultados inesperados.