AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79152269
Accepted
NyxCode
NyxCode
Asked: 2024-11-03 15:45:51 +0800 CST2024-11-03 15:45:51 +0800 CST 2024-11-03 15:45:51 +0800 CST

Diferença entre "ADC r18, r18" e "ROL r18" da AVR

  • 772

O AVR tem as instruções ADC(Add with Carry) e ROL(Rotate Left through Carry).
No entanto, parece-me que ROLnão é necessário e ADC r, rcumpre o mesmo propósito.

Até onde eu sei, ambos ADC r, re ROL rresultam em (r << 1) | carry. Para ambos, o carry é definido como o MSB do operando.

Aqui está um exemplo:

  • r = 0x12 = 0001_0010,carry = 0
    • ADC r, r
      • r = 0010_0100 = 0x24
      • carry = 0
    • ROL r
      • r = 0010_0100 = 0x24
      • carry = 0

Intuitivamente, adicionar o registro a si mesmo é multiplicá-lo por dois, o que é o mesmo que um deslocamento para a esquerda por um. ADCtambém adiciona o transporte, que se torna o novo LSB do resultado.

Então, o que é ROLeven para então? Há alguma diferença semântica entre ROL rand ADC r, r?
Acredito que o mesmo argumento poderia ser feito para RORand SBCtambém.

assembly
  • 2 2 respostas
  • 56 Views

2 respostas

  • Voted
  1. Best Answer
    Peter Cordes
    2024-11-03T16:12:23+08:002024-11-03T16:12:23+08:00

    Não há diferença; os documentos até dizem rol Rdque é apenas um alias para adc Rd,Rd, então é o mesmo opcode, apenas um alias de conveniência para a fonte asm para transmitir mais claramente o significado semântico para leitores humanos.
    http://content.alexandria.atmel.com/webhelp/GUID-0B644D8F-67E7-49E6-82C9-1B2B9ABE6A0D-en-US-1/GUID-61A4FA30-4426-42D7-B199-0EBF064BF9E1.html

    Mas sbc same,samenão é uma rotação para a direita; o transporte se propaga de baixo para cima (da direita para a esquerda) tanto para subtração quanto para adição.
    sbc same,sameestá x-x - carrydefinindo o registro para 0ou -1, dependendo apenas do transporte.


    Observar um ISA diferente fornece um contraste interessante de escolhas de design de ISA:
    o x86 tem um opcode separado para RCL r/m(rotate through carry) vs. ADC r, r/m. Sendo uma máquina CISC, ela permite até um operando de memória explícito para a maioria das instruções, então adc dword [ebx], [ebx]não é codificável, então rcl dword [ebx], 1não é redundante. O AVR é ​​um RISC, então todas as instruções de computação podem usar apenas operandos de registro. O
    x86 também permite contagens diferentes de 1 para deslocamentos/rotações, incluindo variáveis ​​de tempo de execução, mas esses são opcodes separados do opcode rotate-by-implicit-1. (O 8086 original não tinha rotate by immediate count, apenas 1 ou CL)

    • 3
  2. emacs drives me nuts
    2024-11-04T01:33:50+08:002024-11-04T01:33:50+08:00

    Então, ROLpara que serve mesmo?

    É um açúcar sintático e permite um código assembly mais conciso e legível.

    Existem diferenças semânticas entre ROL re ADC r,r?

    Não.

    Acredito que o mesmo argumento poderia ser feito para RORe SBCtambém.

    Não. RORé um "ROtate Right (registro) através de carry". SBCé "SuBtract com Carry". Essas são operações muito diferentes.

    Embora existam muitos outros casos de taquigrafia/açúcar sintático:

    Sugar      Resolution    Description
    ===================================================================
    CLR  r     EOR  r,r      CLeaR all bits in register (changes SREG)
    SER  d     LDI  d,0xff   SEt   all bits in d-Register
    TST  r     AND  r,r      TeST register (set Z and N flag according to r)
    SBR  d,m   ORI  d,m      Set   Bits in dReg (1's in mask m become 1's in d)
    CBR  d,m   ANDI d,~m     Clear Bits in dReg (1's in mask m become 0's in d)
    LSL  r     ADD  r,r      Logic Shift 1 bit Left.
    ROL  r     ADC  r,r      ROtate Right through carry
    BR** L     BRBC b,L      BRanch to L if Bit b in SREG is Clear
    BR** L     BRBS b,L      BRanch to L if Bit b in SREG is Bet
    The last two cases have many different aliases depending on b:
    BRNE, BRCC=BRSH, BRHC, BRTC, BRIC, BRPL, ...
    BREQ, BRCS=BRLO, BRHS, BRTS, BRIS, BRMI, ...
    
    • 1

relate perguntas

  • x86 - mudando de 32 bits para 64 bits via RETF

  • Opcode não reconhecido em instruções de montagem de ponto flutuante para Xiao ESP32-C3 (baseado em RISC-V)

  • Como usar o GNU Assembler (GAS) para criar um arquivo ELF escrito à mão a partir do arquivo .s correspondente

  • Não consigo ler o registro LY do gameboy

  • Obtenha o valor do parâmetro no Assembly

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve