uma duvida: é em 16 ou 32 bits?? ^^
parece que´assembly de 16 bits ^^
parece que´assembly de 16 bits ^^
MOV AX, 01 //Insere o valor 1 no registrador AX MOV BX, AX //Move o que estava em AX para BX MOV AH, 0x20 //Insere o valor 20 em HEXA no byte alto de AX MOV BL, 0x43 //Insere o valor 43 em Hexa no byte baixo de BX
INT 0x21 ;Chama a interrupção de software 21 Hexa
MOV AX, 0x4C00 ; Insere 4C00 no registrador AX, que armazena 4 bytes(em máquinas de 32 bits) INT 0x21 ; chama a interrupção 21 de software
MOV AH,2 ; Serviço 2 da interrupção 21 MOV DL,'A' ; Caractere que deve ser impresso int 0x21 ; Chama a interrupção 21 e imprime na tela
MOV AH,2 ; Serviço 2 da interrupção 21 MOV DL,'A' ; Caractere que deve ser impresso INT 0x21 ; Chama a interrupção 21 e imprime na tela MOV AX, 0x4C00 INT 0x21
varbyte DB 0 ; 1 byte chamado "varbyte" é inserido varword DW 0 ; 1 word chamado "varword" é inserido vardouble DD 0 ; 1 duplo chamado "vardouble" é inserido bb DB 0,1 ; 2 bytes chamados "bb" são inseridos word3 DW 1,1,1 ; 3 words chamados "word3" são inseridos strg DB 'abcd' ; uma string de 4 bytes chamada "strg" é inserida
MOV AL, 15 ; Insere 15 no byte baixo de AX MOV [varbyte], AL ; Move 15 para a variável varbyte MOV BX, 0x8765 ; Insere 8765 hexa em BX MOV [varword], BX ; Move o valor de BX para a variavel varword MOV [bb], BX ; O valor de "bb" se torna 0x8765 MOV BH, [bb] ; BH = Primeiro byte em "bb" = 0x65 MOV BL, [bb+1] ; BL = Segundo byte em "bb" = 0x87 MOV DL, [strg] ; DL = Primeiro byte em "strg" = 'a' MOV DL, [strg+1] ; DL = Segundo byte em "strg" = 'b' MOV DL, [strg+2] ; DL = Terceiro byte em "strg" = 'c' MOV DL, [strg+3] ; DL = Quarto byte em "strg" = 'd'
MOV DX, strg ; DX = Coloca em DX o valor de "strg"(na verdade DX se torna um ponteiro para strg, cada vez que nos referimos a ele, ele aponta pra strg) MOV AL, [DX] ; AL = Primeiro byte em "strg" = 'a'
[ORG 0x100]
MOV AH, 9 ; AH deve ser 9 para a int 21 imprimir uma string MOV DX, msg ; DX=Ponteiro para msg INT 0x21 MOV AX, 0x4C00 ; Termina o programa INT 0x21 msg DB 'HelloWorld!$' ; Insere a mensagem que é uma string terminada em "$"
[ORG 0x100] MOV AH, 9 ; Imprime "Escreva aqui: " MOV DX, msgentrada ; INT 0x21 ; MOV AH, 0xA ; Guarda as teclas digitadas MOV DX, buff ; e armazena no buffer INT 0x21 ; MOV AX, 0x4C00 ; Termina o programa INT 0x21 ; msgentrada DB 'Escreva aqui: $' ; E finalmente o buffer buff: max DB 20 count DB 0 data DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
JE - Salta se for igual (Equal) JNE - Salta se for diferente (Not Equal) JZ - Salta se for zero JNZ - Salta se não for zero JA - Salta se acima (Above) JAE - Salta se acima ou igual (Above or Equal) JB - Salta se abaixo (Below) JBE - Salta se abaixo ou igual (Below or Equal) JNA - Salta se não acima (Not Above) JNB - Salta se não abaixo (Not Below) JMP - Salto Incondicional
[ORG 0x100] MOV CX, 0 ; CX é o contador, colocamos 0 nele Escreve: ; marcador chamado Escreve, para o programa saber para onde direcionar o salto MOV AH, 9 ; Escrever mensagem MOV DX, msg INT 0x21 INC CX ; CX é o contador e a instrução INC vem de Increase, Incrementar (CX = CX +1) CMP CX, 5 ; Compara o valor de CX com 5 JNE Escreve ; Caso o contador seja diferente de 5, salta para Escreve e repete tudo até chegar no salto novamente MOV AX, 0x4C00 ; Termina o programa INT 0x21 msg DB 'BELEZA!',13,10,'$' ; A string contém o código 13,10, que faz com que o console passe para a próxima linha
[ORG 0x100] CALL funcao ; Chama a função MOV AX, 0x4C00 ; Termina o programa INT 0x21 ; funcao: ; Começo da função ; aqui colocamos o código que será executado RETN ; Essa instrução indica o fim de uma função, dizendo ao programa para sair do código da função e retornar ao código principal do programa
[ORG 0x100] comeco: MOV AH, 9 ; Serviço 9 (de impressão) da INT 21 MOV DX, msg1 ; Coloca o DX como ponteiro para a mensagem "Digite Algo: " INT 0x21 ; Chama a interrupção e escreve na tela teclas: MOV AH, 0x1 ; Serviço 1 da função 21, para rastrear uma tecla INT 0x21 CMP AL,13 ; o código da tecla é gravada em AL. Se for 13(enter)... JE final ; Salte para o marcador "final" CMP AL, 27 ; Se for Esc JE fechar ; termina o programa MOV [data+bx], AL ; põe caracter da tecla no buffer MOV BL, [count] ; põe número já digitado em BL INC BX ; incrementa número de caracteres MOV [count], BL; atualiza o count CMP BL, 20 ; se o número de caracteres for 20.... JE final ; Pular para o marcador "final" JMP teclas ; Case nenhum jump acima seja tomado, salta para o marcador "teclas" e espera uma nova tecla final: MOV AL, '$' ; Põe o caractere terminador '$' em AL MOV BL, [count] ; Põe número de teclas digitadas em BL MOV BH, 0 ; Zera o byte alto de BX MOV [data+bx], AL ; Adiciona o '$' no final do buffer MOV AH, 9 ; Serviço 9 da interrupção 21 MOV DX, msg2 ; DX = ponteiro para msg2 INT 0x21 ; Escreve msg2 ("Texto digitado: ") na tela MOV AH, 9 ; Serviço 9 da função 21 MOV DX, data ; DX = ponteiro para os dados do buffer INT 0x21 XOR BX,BX ; Zera o registrador BX (mesma coisa que MOV BX,0) MOV BL, 20 ; Máximo de caracteres (20) XOR AX,AX ; Zera o registrador AX MOV [count], AL ; Zera o contador limpar: MOV [data+bx], AL ; Põe 0 na posição início do buffer + BL DEC BL ; Decrementa BL CMP BL, 0 ; Compara BL com 0 JA limpar ; Se for maior que 0 continua limpando o buffer JMP comeco ; Se BL for 0, volta para "comeco" e reescreve "Digite Algo: " fechar: MOV AX, 0x4c00 ; terminar programa INT 0x21 ; Os caracteres 13 e 10 forçam uma nova linha msg1 DB 13,10,13,10,'Digite Algo: $' msg2 DB 13,10,'Texto Digitado: $' ; Este é o buffer de entrada com espaço para 20 bytes para caracteres ; e 1 byte para '$' buf: count DB 0 data DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
MOV AX, 456 MOV BX, 789 PUSH AX ; Coloca o valor de AX na pilha, que é 456 PUSH BX ; Coloca o valor de BX na pilha, que é 789 POP AX ; AX = Valor que está no topo da pilha = 789 POP BX ; BX = Valor que está no topo da pilha = 456
MOV AX, 1000 ; AX = 1000 MOV DS, AX ; Altera o número do DS (segmento de dados) para 1000 MOV AX, [ds:0] ; Põe word do endereço 1000:0000 em AX - endereço 16000 MOV [1234], AX ; Põe valor de AX no segmento atual no deslocamento 1234 INC AX ; Incrementa AX MOV [ds:32], AX ; Põe valor de AX no endereço 1000:0032 - endereço 16032
Comment