Asm x86, IN/OUT operace – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Asm x86, IN/OUT operace – Assembler – Fórum – Programujte.comAsm x86, IN/OUT operace – Assembler – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Jimmy
~ Anonymní uživatel
2 příspěvky
23. 1. 2008   #1
-
0
-

Prosím, může mi někdo poradit?? Začínám s assemblerem a nemůžu přijít na to, jak získat od uživatele dvě čísla, ty pak sečíst a ukázat na obrazovce. Je možný nějaký jiný způsob zobrazení obsahu proměnné než kopírovat vše do videopaměti?? (0B800)?

Nahlásit jako SPAM
IP: 85.193.33.–
Reklama
Reklama
_k_
Duch
25. 1. 2008   #2
-
0
-

Ak mozes tak pouzi standartnu C kniznicu... napr. takto:

 .section .data

read_text:
.ascii "%d %d"
print_text:
.ascii "Sucet je: %d\n"
a1: .long 0
a2: .long 0

.section .text
.globl main
.type main, @function
main:
push %ebp
mov %esp, %ebp
pushl $a1
pushl $a2
pushl $read_text
call scanf
mov a1, %eax
add a2, %eax
push %eax
push $print_text
call printf
mov $0, %eax
mov %ebp, %esp
pop %ebp

Nahlásit jako SPAM
IP: 195.91.54.–
Laaca0
Stálý člen
26. 1. 2008   #3
-
0
-

Já jsem to napsal takhle:



;Program secte dve cisla. Zkompiluje se v TASM

.8086
.MODEL TINY
.CODE
ORG 100h

STARTUPCODE
JMP @START

r db 10 dup(?)
vstup db 10,0,0,0,0,0,0,0,0,0,0,0
ci1 dw ?
ci2 dw ?

crlf db 13,10,0
zadej1 db 'Zadej prvni cislo: ',0
zadej2 db 'Zadej druhe cislo: ',0
vysledek db 'Vysledek je: ',0
nicnezcislo db 'Zadavej pouze cisla !',13,10,0

;Procedura print - vytiskne retezec-----------------------------
print proc near ;retezec musi byt v DS:SI a koncit ASCII 0
push dx
@cycle:
mov dl,ds:[si]
inc si
cmp dl,0
jz @finished
mov ah,2
int 21h
jmp @cycle
@finished:
pop dx
ret
print endp
;---------------------------------------------------------------


;Procedura INT2STR - prevede cislo na zobrazitelny retezec
int2str proc near ;AX = hodnota, DS:SI = ASCIIZ retezec
push si
xor cx,cx
mov bx,10
mov di,0
@smycka1:
;------------------------------------------------------
xor dx,dx
div bx ;AX:=AX div 10; modulo v DX, vysl.beze zbytku v AX
add dx,48
inc cx
push dx ;nemuzu to dat do retezce rovnou, protoze by to bylo pozadu
;obratim to pomoci PUSH/POP

cmp ax,0
jnz @smycka1
;------------------------------------------------------

@smycka2:
pop dx
mov ds:[si],dl
inc si
loop @smycka2

@ukonceni:
mov al,0
mov ds:[si],al
pop si
ret
int2str endp
;------------------------------------------------------


;Procedura ZadejRetezec----------------------------
ZadejRetezec proc near
mov dx,si
mov ah,0ah
int 21h
inc si
ret
ZadejRetezec endp
;--------------------------------------------------


;Procedura PrevedRetezec
;Retezec prevede na cislo, ktere ymusti do DX.Kdyz v nem budou
;neciselne znaky, tak nastavi ZF na nulu
PrevedRetezec proc near
mov cl,ds:[si] ;delka retezce do cl
cmp cl,0 ;retezec je prazdny?
jz @zr_vynuluj
mov dx,0
mov ch,0
mov bx,1
add si,cx
std
@zr_cykl:
lodsb
mov ah,0
cmp al,48
jb @zr_vynuluj
cmp al,57
ja @zr_vynuluj
sub al,48

push dx
mul bx
pop dx
add dx,ax

push dx
mov ax,10
mul bx
mov bx,ax
pop dx
dec cx
jnz @zr_cykl
stc
jmp @zr_konec
@zr_vynuluj:
clc
@zr_konec:
cld
ret
PrevedRetezec endp


;======================================================
@Start:
lea si,zadej1
call print
lea si,vstup
call ZadejRetezec
call PrevedRetezec
jc @vse_v_poradku1
lea si,nicnezcislo
call print
jmp @konecprogramu

@vse_v_poradku1:
mov ci1,dx
lea si,crlf
call print
;------------------------------------------------------
lea si,zadej2
call print
lea si,vstup
call ZadejRetezec
call PrevedRetezec
jc @vse_v_poradku2
lea si,nicnezcislo
call print
jmp @konecprogramu

@vse_v_poradku2:
add dx,ci1
lea si,crlf
call print

lea si,vysledek
call print

mov ax,dx
lea si,r
call int2str
call print

@konecprogramu:
xor bx,bx
mov ax,4c00h
int 21h
end


Program má svoje omezení - neumí záporná či reálná čísla a pracuje jenom s šestnáctibitovými registry - výsledek tudíž nesmí být větší než 65535.

Nahlásit jako SPAM
IP: 81.0.253.–
DOS-u-akbar
Tocimanko0
Grafoman
26. 1. 2008   #4
-
0
-

:smile19: :smile19: :smile19: Hmm, Assembler je vážne ďaleko pod low-level... Stačí kúsok a už je to v jednotkách a nulách :D

Nahlásit jako SPAM
IP: 195.91.54.–
Freelance copywriter
(web copywriting, sales letters, PR articles)
http://blog.tociman.net
_k_
Duch
26. 1. 2008   #5
-
0
-

To Tocimanko : A to je na nom pekne ... ;)

Nahlásit jako SPAM
IP: 195.91.54.–
Laaca0
Stálý člen
26. 1. 2008   #6
-
0
-

Ono by to šlo napsat i úspornějc, ale takhle je to, myslím, srozumitelnější.

Nahlásit jako SPAM
IP: 81.0.253.–
DOS-u-akbar
Tocimanko0
Grafoman
26. 1. 2008   #7
-
0
-

Assembler je hustý :) Nikdy by som sa ale neznížil až na úroveň strojového kódu :D

Nahlásit jako SPAM
IP: 195.91.54.–
Freelance copywriter
(web copywriting, sales letters, PR articles)
http://blog.tociman.net
Laaca0
Stálý člen
27. 1. 2008   #8
-
0
-

No pozor - v podstatě assembler = strojový kód. Assemblerové instrukce přesně odpovídají strojovým číselným hodnotám. Prostě místo takového: "90,CD,10" napíšu "nop; int 10h". Zápis je srozumitelnější, ale přesně odpovídá strojovému kódu.

Nahlásit jako SPAM
IP: 81.0.253.–
DOS-u-akbar
Jimmyx860
Duch
28. 1. 2008   #9
-
0
-

aha .. no nebude to zas tak jednoduchy jak sem si myslel :( asi se mam jeste co ucit, a neda se udelat primo .com? nebo nezalezi na typu programu??

Nahlásit jako SPAM
IP: 213.29.30.–
Zelenáč0
Posthunter
28. 1. 2008   #10
-
0
-

To Jimmyx86 : "primo com"??? Nechapu..

Nahlásit jako SPAM
IP: 89.176.254.–
Laaca0
Stálý člen
28. 1. 2008   #11
-
0
-

No, tak úplně hypoteticky přímo COM soubor udělat jde, ale proč bys to sakra dělal. To není ani o ň víc low-level než assembler. Nicméně jestli to chceš zkusit:
Vezmi si nějaký editor, který umí hexadecimální editaci, eventuálně přinejhorším alespoň editaci z ASCII tabulky a zadej tyto hexa hodnoty:
"B4 0B 33 DB B3 02 CD 10 C3" (bez uvozovek) a tento soubor ulož jako .COM (třeba POKUS.COM) - ten pak můžeš rovnou spustit.

Normální člověk si ale pořídí Turbo assembler, napíše tenhle zdroják:



.model tiny
.code
startupcode
mov ah,0bh
mov bx,2
int 10h
ret
end

který:
1) Přeloží (TASM pokus.asm)
2) Slinkuje (TLINK /t pokus.obj)
3) Spustí

Nahlásit jako SPAM
IP: 81.0.253.–
DOS-u-akbar
Jimmyx860
Duch
2. 2. 2008   #12
-
0
-

napsal sem zatim tohle, ale program pokazdy skonci misto aby cekal na klavesu a ja si moc prohlednout vysledky nevite nekdo co to zpusobuje??

A SEGMENT
ASSUME CS:A,DS:A
ORG 100H

START:

MOV AH,09H
MOV DX,OFFSET ZADEJ1
INT 21H

MOV AH,0AH
MOV DX,OFFSET BUFFER
INT 21H

MOV BX,OFFSET TEXT
MOV DX,0
MOV CL,POCET
MOV CH,10

SEM:
MOV AX,0
MOV AL,BYTE PTR [BX]
SUB AL,'0'
MUL CH
ADD DX,AX

INC BX
DEC CL

CMP CL,0
JNZ SEM

MOV CISLO1,DX

MOV AH,09H
MOV DX,OFFSET ZADEJ2
INT 21H

MOV AH,0AH
MOV DX,OFFSET BUFFER
INT 21H

MOV BX,OFFSET TEXT
MOV DX,0
MOV CL,POCET
MOV CH,10

SEMM:
MOV AX,0
MOV AL,BYTE PTR [BX]
SUB AL,'0'
MUL CH
ADD DX,AX

INC BX
DEC CL

CMP CL,0
JNZ SEMM

MOV CISLO2,DX

MOV AX,CISLO1
MOV DX,CISLO2
ADD DX,AX

MOV SOUCET,DX

;==================================ODSUD PREMENA CISLA NA TEXT

MOV AX,SOUCET
MOV CL,10
MOV BX,OFFSET ODPOVED

SSEM:
DIV BYTE PTR DESET
ADD AH,'0'
MOV BYTE PTR [BX],AH

INC BX

CMP AL,0
JNZ SEMM
MOV BYTE PTR [BX],'$'


MOV AH,09H
MOV DX,OFFSET ODPOVED
INT 21H

;=================================TADY CHCI CEKAT NA KLAVESU

MOV AH,00H
INT 16H

INT 20H



BUFFER DB 20
POCET DB 0
TEXT DB 18 DUP('x')
ODPOVED DB 20 DUP('x')
CISLO1 DW 0
CISLO2 DW 0
SOUCET DW 0
DESET DB 10
ZADEJ1 DB 'Zadej prvni cislo: > $'
ZADEJ2 DB 10,13,'Zadej druhe cislo: > $'
VYSLEDEK DB 10,13,10,13,'Soucet je: > $'

A ENDS
END START

Nahlásit jako SPAM
IP: 85.193.33.–
vsman
~ Anonymní uživatel
8 příspěvků
23. 2. 2008   #13
-
0
-

Aký má zmysel robiť so 16b asm, čo to je za kravinu. To v dnešnej dobe neni použitelné. Treba sa učiť C jazyk a v ňom používať ASM procedúry. Také interrupty ako INT21H a ostatné BIOSovské sú dead.

Pravdepodobne ti nefunguje BIOS, tak skús DOS službu:

MOV AH, 01h
INT 21h

Nahlásit jako SPAM
IP: 89.173.13.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 194 hostů

Podobná vlákna

Simulator pre x86 — založil F.J.

Lze psát pro x86 přenositelně? — založil Matěj Andrle

Asm v C++ — založil Sir_E

Asm 8086: OUT DX,AX — založil Mircosoft

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý