praegune kellaaeg 25.06.2025 20:43:17
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Karlsson
Kreisi kasutaja
liitunud: 20.08.2004
|
04.10.2011 00:27:54
Programm ei lõpeta tööd (dos, nasm) |
|
|
Kribasin väikse skripti. Probleemiks on see, et see ei välju Dos'i.
Kas keegi oskab öelda miks ja kuidas seda lahendada?
Spoiler 
;Käsu (instruktsiooni) cpuid kasutamine
;Süntaks: CPUID
;Kirjeldus: Enne instruktsiooni kutsumist tuleb panna EAX-registrisse väärtus vastavalt infole, mida loodetakse saada. Kui EAX on 0, siis kirjutab Inteli protsessor registritesse EBX, ECX ja EDX “GenuineIntel” (EBX = 0x756e6547h = "Genu", EDX = 0x49656e69h = "ineI" ,ECX = 0x6c65746eh = "ntel" ). AMD protsessor kirjutab näiteks “AuthenticAMD” ja iga protsessoritootja, kes seda instruktsiooni toetab, omab oma 12-tähelist stringi. Kui EAX-i väärtuseks enne kutsungit panna 1, siis kirjutatakse registritesse protsessori seeria ja omadused.
jmp long Start
cpu_id: db '123456789012', 0; Null terminated string. ;reserve 12 bytes of memory
;------------------function Move Cursor----------------------
;Eelnevalt seadistada X = DL ja Y = DH (ekraan algab positsioonist 0,0)
;Set cursor position AH=02h BH = Page Number, DH = Row, DL = Column
Move_Cursor:
mov ah, 02h ;set cursor
mov bh, 0h ;page number
int 10h ;int 10
ret
;-----------------Print_Char begin-----------
Print_Char: ;Procedure to print character on screen
;al registrist ootame tähte
;Assume that ASCII value is in register AL
mov ah, 0Eh ;Tell BIOS that we need to print one charater on screen.
mov bh, 0h ;Page no.
mov bl, 0Fh ;Text attribute 0x07 is lightgrey font on black background
int 10h ;Call video interrupt
ret ;Return to calling procedure
;-----------------Print_Char end--------------
;-----------------Prindime kindla arvu stringe ------------
;si registris on lause db. cx etteantud arv dx loendur.
;ootame si, cx registrite väärtust
;Assume that string starting pointer is in register SI (string peab olema määratid SI registris
PrintCountString: ;Procedure to print Null terminated string on screen
next_character_2: ;Lable to fetch next character from string
mov al,[si] ;Get a byte from string and store in AL register
call Print_Char ;Else print the character which is in AL register
inc si ;Increment SI pointer
inc dx ;loendurile 1 pos edasi
cmp cx, dx ;võrdleme loenduriga
je exit_print_count_str ;If end then return
jmp next_character_2 ;Fetch next character from string
exit_print_count_str: ;End label
ret ;Return from procedure
;----------------Kindla arvuga stringi print end
Start:
mov eax, 0; ;Võtame tootja nime
cpuid
mov [cpu_id],ebx ;Salvestame registrid mällu
mov [cpu_id+4],edx
mov [cpu_id+8],ecx
;kursori seadistamine
mov dl, 0; ;Liigume ekraanipunktidele 0,0
mov dh, 0;
call Move_Cursor
mov si, cpu_id ;viitame cpuid muutujale
mov cx, 12 ;prindime 12 tähte (ehk cpu vendor id)
mov dx, 0 ;nullime loenduri
call PrintCountString
;Sellelt kohalt on midagi perses, ei välju dosi
;Dos Terminate program
mov ah, 4Ch ; Terminate
mov al, 0 ; exit with error code 0
int 21h ; call DOS service
; -------------- Ootame klahvivajutust -----------------------------------
; mov ah, 0H ;Read key, Return AH scan code, AL extended ASCII
; int 16H ;Keyboard interrupt
|
|
Kommentaarid: 90 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
81 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
04.10.2011 00:32:33
|
|
|
Debuggeriga step'ida ei saa käsu haaval?
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
Karlsson
Kreisi kasutaja
liitunud: 20.08.2004
|
04.10.2011 08:42:22
|
|
|
Ei tea ühtki debugerit, aga uurin asja.
Hetkel võib sellese skripti enne Dos'i väljumist veel koodi kirjutada ja see kõik täidetakse. Probleemiks on just see koht, mis seal kirjas. Ei oska hetkel arvata ka mis tingimus vaja täita on.
|
|
Kommentaarid: 90 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
81 |
|
tagasi üles |
|
 |
pupsik46
Kreisi kasutaja
liitunud: 12.04.2004
|
04.10.2011 13:30:23
|
|
|
Täitsa huvitav on üle pika aja lugeda assembleri koodi! Kahjuks winxp all ei anna debuggida antud koodi, debugger (ollydebug) annab ainult exeptioni.
Kas midagi mõistlikku ekraanile manatakse ka? Kui ei, kas siis peaks olema mov si, [cpu_id] enne call PrintCountString?
PS. Assemblerile peaks teadma andma, et kood on prosele .586
Radasm+masm32 kiire häkk
Spoiler 
.586
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include cpuid.inc
.data
cpu_id db 13 dup
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
invoke ExitProcess,0
;########################################################################
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax,uMsg
.if eax==WM_INITDIALOG
; int 3
xor eax,eax ; mov eax, 0 = retrieve vendor string in ebx, edx, ecx
cpuid ; CPUID requires AMD 486 or Pentium
mov dword ptr [cpu_id],ebx
mov dword ptr [cpu_id+4],edx
mov dword ptr [cpu_id+8],ecx
mov byte ptr [cpu_id+12],0
invoke MessageBox, NULL, addr cpu_id, addr cpu_id, MB_OK
.elseif eax==WM_COMMAND
.elseif eax==WM_CLOSE
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
_________________ M/V: Estonia 010 , Odissei 010 võimendid
O/V: 10.1", 12,1" ja 13.3" LCD paneeli |
|
Kommentaarid: 73 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
70 |
|
tagasi üles |
|
 |
DoS
HV veteran

liitunud: 19.08.2002
|
04.10.2011 23:34:54
|
|
|
org 100h, muidu kirjutad PSP üle
|
|
Kommentaarid: 50 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
47 |
|
tagasi üles |
|
 |
Karlsson
Kreisi kasutaja
liitunud: 20.08.2004
|
05.10.2011 07:42:06
|
|
|
Täpselt nii oligi. Skripti algusest oli see org 100h puudu.
Tänud teile kõigile!
|
|
Kommentaarid: 90 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
81 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|