Pergunta

Eu apenas comecei usando linguagem assembly (sentida como aprender algo novo) e ter executado em algumas perguntas (até agora) que todos os tutoriais eu estive olhando através de não responder, ou são demasiado velho para sei.

1) Eu tentei algumas pesquisas (talvez eu só não sei as palavras corretas), mas não consigo encontrar uma lista atualizada de modos gráficos para alterar a resolução de tela, etc. O melhor que eu encontrei é: Assembler Tutorial , e eu dificilmente acho que 640x480 é o melhor linguagem assembly resolução pode usar. Alguém sabe de um tutorial mais atualizado que posso usar?

Editar: interrupção 10h é velho, e não chega a suportar mais de 640x480

2) É possível "mov" um valor de uma variável para outra variável sem movê-lo para um registo em primeiro lugar? Exemplo:

jmp start
  n1     dw 0
  n2     dw 0
  res    dw 0
start:
  mov n1,5
  mov n2,6
  mov res,n1
  add res,n2
...etc...

Edit: Não é possível. Você não pode ir de memória para a memória sem usar registradores.

3) Indo com a questão 1, há uma maneira de detectar o modo gráfico um usuário está usando, para que eu possa mudá-lo e alterá-lo de volta depois? (I supor que há, mas não sei como fazê-lo.)

Editar:. Necessidade de OS consulta para configurações gráficas

Foi útil?

Solução

Para perguntas # 1 e # 3, olhar para o VESA BIOS Extensions . Isso era algo de um padrão para lidar com modos "Super VGA", popular na década de 90.

Quanto nº 2, em geral, a resposta é não, você não pode memória MOV para a memória. Mas não é rigorosamente verdade: não há MOVS (string movimento), que move um byte, palavra ou DWORD do DS: SI para ES: DI. Normalmente, esta instrução é usado em conjunto com um prefixo REP para mover blocos de memória. Além disso, supondo que você tem uma pilha configurado, você pode mover memória-a-memória sem sobrepor um registo empurrando e popping:

PUSH [mem1]
POP  [mem2]

Outras dicas

Quanto à sua primeira pergunta, interromper 10 é muito antiga, e provavelmente não utilizados para além resoluções de 640x480. A parte diferente da pilha de software é usado agora; ou seja, você teria de interrogar o Windows para obter a resolução de tela atual.

Este vez detalhado pós contém um monte de detalhes de como usar assembler para conduzir DirectX no Windows. DirectX é a família API chave para gráficos nos dias de hoje, você não vai chegar longe usando interrupções DOS-era e programar o framebuffer VGA diretamente.

interrupção 10h é basicamente uma chamada de função do sistema operacional (na verdade, ele é executado código de BIOS). Internamente, ele lê / escreve memória de vídeo, bem como vários registos na placa de vídeo. Para se ter uma idéia de que tipo de coisa acontece "dentro" interrupção 10h, verifique este a.

Quando você executar um programa DOS no Windows, ele é executado em uma máquina DOS virtual. Windows não realmente deixe tocar a placa gráfica, mas permite que ele jogue com um virtual. Normalmente, isso só se estende até modos VGA de tela (e às vezes somente em modo texto), ou seja, o que você tem é um cartão VGA virtual (não uma placa gráfica moderna). Por esta razão, em linguagem assembly de 16 bits no Windows, você simplesmente não pode usar todos os recursos de placas de vídeo modernas.

Sim, com certeza, a linguagem assembly pode deixá-lo fazer qualquer coisa a placa gráfica pode fazer. Mas somente se:

  • seu programa tem acesso irrestrito ao hardware gráfico (por exemplo, você está escrevendo um driver de dispositivo Windows ou Linux, ou estão sendo executadas em puro DOS, ou o seu próprio kernel), ou
  • seu programa passa pela interface do sistema operacional apropriado.

Se você ainda estiver interessado em linguagem assembly, eu sugiro que você tente escrever um kernel brinquedo. Fazendo isso, você vai aprender um monte de coisas.

Deixe um comentário se você quiser mais informações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top