Gente ajuda em Assembly, Fiz mas da ERRO NA CPU NTLDR

11 respostas
SirDominque

1)elaborar um programa para ler 4 caracteres sem exibilos e exibir em seu lugar o caracter "*"(2a). comparar

com uma senha e exibir na tabela 'ok' se os caracteres forem iguais e 'nor' se forem diferentes.

- a 970
mov [950],4
mov [951],3
mov [952],2
mov [953],1

- a 1000
mov SI,900
mov BP,950
mov dh,2A
mov ah,07
int 21
mov[900],AL
int 21
mov[901],AL
int 21
mov[902],AL
int 21
mov[903],AL
mov cx,04
mov AX,[BP]
cmp[SI],AX
INC SI
INC BP
JNZ 1080
jmp 1021
mov ah,09
mov dx,1050 // db 'OK$'

==

a 1050
db 'OK$'
int 21
int 3

a 1080
mov ah,09
mov dx,1090


a 1090
db 'NOK$'
int 21
int 3

Gente, podem me dar uma luz ?
Entanglement :P

11 Respostas

E

Você está rodando seus programas no Windows de 32 bits para que o programa Debug (que é de 16 bits) execute esse código velho do DOS (em 16 bits), é isso?

SirDominque

entanglement:
Você está rodando seus programas no Windows de 32 bits para que o programa Debug (que é de 16 bits) execute esse código velho do DOS (em 16 bits), é isso?

Isso.

Exatamente;

Eu rodo ele na virtual machine da oracle no win XP;
E

Pelo menos você consegue usar o comando T para rodar seu programa passo-a-passo para ver que coisa esquisita ele está fazendo, não?

SirDominque

Vou tentar;

SirDominque

Vou tentar;

Então rapaz, tentei rodar, mas nao funcionou por causa dos int 21, e quando rodei g = 1000 , ele fechou o programa e voltou pro CMD.
Ou seja, as vezes ele funciona, as vezes nao. As vezes da erro, outras não…
Não entendo porque tenho que aprender uma linguagem que , pelo menos ao meu ver, nao tem consistência…

E

A propósito, lembra que lhe passei links sobre como criar programas em Assembly que rodam em Win32 em vez do DOS, que é o que você está usando?
Eu acho terrível ter de lidar com essa documentação antiga do INT21 e outras coisas mal-comportadas.
Você precisa ler a documentação com cuidado e ver todos os registradores (é por isso que eu falei para rodar passo-a-passo). Note que cada registrador é importante quando você usa INT21, e não se esqueça que, depois do INT21 rodar, você pode supor que todos os registradores ficam estragados, portanto você precisa de algumas instruções (como PUSH e POP) para poder guardar os registradores que ficaram estragados.

SirDominque

entanglement:
A propósito, lembra que lhe passei links sobre como criar programas em Assembly que rodam em Win32 em vez do DOS, que é o que você está usando?
Eu acho terrível ter de lidar com essa documentação antiga do INT21 e outras coisas mal-comportadas.
Você precisa ler a documentação com cuidado e ver todos os registradores (é por isso que eu falei para rodar passo-a-passo). Note que cada registrador é importante quando você usa INT21, e não se esqueça que, depois do INT21 rodar, você pode supor que todos os registradores ficam estragados, portanto você precisa de algumas instruções (como PUSH e POP) para poder guardar os registradores que ficaram estragados.

OK, vou mostrar esse seu post pro meu professor, e ver o que ele diz.
Mas entaglement, vc pode me passar esses links , por favor?? plx plx

E

http://www.guj.com.br/java/277456-assembler-tasm

(Desculpe, não era com você e sim com outro cara).

E

Uma coisa que é indispensável para você que quer aprender Assembly é usar um assembler, e também a comentar muito seu código. Do jeito que você mostrou o seu código, não fiz nenhum esforço para tentar entendê-lo . Se eu tiver algum tempo, vou dar um exemplo de como eu escreveria o código da leitura da senha (isso se eu conseguir achar algo que gere um .com, pelo jeito só o tasm e o tlink mesmo.)

SirDominque

Ok, Hoje vai ter aula de assembly. Vou comentar esse código de novo, ele estava assim, mas , por algum motivo eu tirei os comentários.

SirDominque

Entanglement. Estou Comentando o código.
Mas enquanto isso, deixa eu te perguntar.

Quando eu usar o db 'asdnakdn askdn $' , ele sempre deve ir no final do código ?

Usei ele uma vez no meio do código, por exemplo, na linha 120, e ele Misturou o código que veio em seguida....
====
====
Segue o código correto , as vezes alguém pode precisar :

mov cx,4
mov bx,200

// O código entre  // , le o teclado sem mostrar?
v1 : mov ah,07
int 21
//
mov [bx],AL
inc Bx

//O código abaixo escreve * na tela
mov DL,2A
mov AH,02
int 21 

loop v1

;
mov cx,4
mov si,200
mov di,210 // A senha correta esta na memória , usar comando debug -E 210 '1234' 

v2 : mov bl,[SI]
CMP[DI],BL
jnz erro
inc SI
inc DI
loop v2

mov dx,220 // Usar comando -E220 'OK$'
mov ah,02
int 21
jmp FIM

erro : mov dx,230 //Usar comando -E230 'NOT OK$'
mov ah,09
int 21

FIM: int  3

/////

Dúvida:
Entanglement, O professor poderia ter usado db, ao invés de -E no debug ?

////

Segue o mesmo código sem comentários e com uma modificação no final :

mov cx,4
mov bx,200

v1: mov ah,07
int 21
mov [BX],AL
INC BX
mov dl,2A
mov ah,02
int 21
loop v1

mov cx,4
mo v si,200
mov di,210

v2: mov bl,[SI]
CMP [DI],BL
JNZ erro
INC SI
INC DI
loop v2
mov dx,220
JMP fim

erro: mov dx,230
fim mov ah,09
int 21
int 3

//
e 210 '1234'
e 220 'OK$'
e 230 'NOK$'
Criado 2 de outubro de 2012
Ultima resposta 9 de out. de 2012
Respostas 11
Participantes 2