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)?
Fórum › Assembler
Asm x86, IN/OUT operace
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
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.
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.
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í
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
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
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Podminka v ASM — založil Mutagen
Násobení v ASM — založil AIPHEE
Asm 8086: OUT DX,AX — založil Mircosoft
čtení single v ASM — založil xanyt