Помощь - Поиск - Пользователи - Календарь
Полная версия: перевод числа в десятичное,вывод на экран и тд
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Catty
в этой проге нужно перменную TotalCount вывести на екран в виде десятичного числа (без процедур, функций, макросов и пр)

data SEGMENT

MyArray DB 1, 2, 3, 1, 2, 3, 1,
TotalCount DB 0
ARRAY_size equ 7



code SEGMENT
ASSUME cs:code, ds:data
begin:

MOV AX, data
MOV DS, ax

lea SI,MyArray
mov bl,[SI+ARRAY_size-1]
mov cx,ARRAY_size

Sloop:
LODSB
cmp al,bl
jne NextChar
inc TotalCount

NextChar:
LOOP Sloop






MOV ax,4c00h
int 21h

code ENDS
end begin

2. В масиве A[m] заменить все нулевые елементи (крщму первого) на значения предыдущего елемента.
масив ввести с клавы и вывести потом на экран, и еще ту же самую задачу сделать с помощью паскаля. Вотя пробовала , но не сложилось....
Uses Crt;
var a:array[1..10] of integer;
m:byte;

begin
ClrScr;
for m:= 1 to 10 do
read(a[m]);


for m:= 1 to 10 do
begin
asm
mov SI,word ptr m
mov ax, word ptr a[SI+1]
cmp ax,0
jnz @No
mov bx,word ptr a[SI]
mov word ptr a[SI+1],bx
@No: mov ax, word ptr a[SI+1]
end;
end;
for m:=1 to 10 do
write(a[m]);
end.
Catty
такое впечатление что тут асма вообще никто не знает....нахрен было ввобще этот раздел создавать......пока дождешься чей то помощи то сам все решишь!!! norespect.gif
xds
В первой программе у тебя не определён стек - я добавил:
_stack	segment stack
db 2048 dup(?)
_stack ends

data SEGMENT

MyArray DB 1, 2, 3, 1, 2, 3, 1
TotalCount DB 0
ARRAY_size equ 7

data ENDS


code SEGMENT
ASSUME cs:code, ds:data
begin:
cld

MOV AX, data
MOV DS, ax

lea SI,MyArray
mov bl,[SI+ARRAY_size-1]
mov cx,ARRAY_size

Sloop:
LODSB
cmp al,bl
jne NextChar
inc TotalCount

NextChar:
LOOP Sloop

xor ax,ax
push ax
mov al,TotalCount
mov cl,10
Div10:
div cl
add ah,'0'
push ax
and ax,0FFh
jne Div10
WriteDig:
pop dx
or dx,dx
jz Done
mov dl,dh
mov ah,2
int 21h
jmp WriteDig
Done:
mov ah,2
mov al,13
int 21h
mov ah,2
mov al,10
int 21h

MOV ax,4c00h
int 21h

code ENDS
end begin



Вторая на ассемблере (в формате COM, её надо "tlink /t"):

N equ 10

TEXT segment
assume cs:TEXT,ds:TEXT

org 100h
entry:
cld

lea di,a
mov cx,N
read_elem:
xor ax,ax
push di
push cx
read_dig:
push ax
mov ah,1
int 21h
cmp al,13
je read_done
cmp al,'0'
jb fmt_error
cmp al,'9'
ja fmt_error
sub al,'0'
xor bx,bx
mov bl,al
pop ax
mov cl,10
mul cl
add ax,bx
jmp read_dig

fmt_error:
mov ah,2
mov dl,8
int 21h
pop ax
jmp read_dig

read_done:
mov ah,2
mov dl,10
int 21h
pop ax
pop cx
pop di
stosw
loop read_elem

lea si,a+2
mov cx,N-1
next_elem:
mov di,si
lodsw
or ax,ax
jnz skip_elem
or dx,dx
jnz next_elem2
mov ax,[si-4]
stosw
mov dx,-1
jmp next_elem2
skip_elem:
xor dx,dx
next_elem2:
loop next_elem

lea si,a
mov cx,N
write_elem:
lodsw
push cx
push si
or ax,ax
jns pos
neg ax
push ax
mov dl,'-'
mov ah,2
int 21h
pop ax
pos:
push 0
mov cx,10
div10:
xor dx,dx
div cx
add dx,'0'
push dx
or ax,ax
jnz div10
write_dig:
pop dx
or dx,dx
jz wr_done
mov ah,2
int 21h
jmp write_dig
wr_done:
mov ah,2
mov dl,' '
int 21h
pop si
pop cx
loop write_elem

mov ah,2
mov al,13
int 21h
mov ah,2
mov al,10
int 21h

mov ax,4C00h
int 21h

a dw N dup(?)

TEXT ends
end entry



Вторая в виде вставок:
program Rep;

const
N = 10;

var
a: array[1..N] of Integer;
i: Integer;

begin
for i := 1 to N do
Readln(a[i]);

asm
cld
lea si,a+2
mov cx,N-1
@@1:
mov di,si
lodsw
or ax,ax
jnz @@2
or dx,dx
jnz @@2
mov ax,[si-4]
stosw
mov dx,1
jmp @@3
@@2:
xor dx,dx
@@3:
loop @@1
end;

for i := 1 to N do
Write(a[i], ' ');
Writeln;
end.
Catty
rolleyes.gif ....я правда уже это сдала но все равно спасибо...
xds
Цитата
но все равно спасибо...
Право, не за что. Впредь было бы неплохо указывать, что необходимость в ответе уже отпала - ведь не все посещают форум ежедневно.
Catty
Цитата
Впредь было бы неплохо указывать, что необходимость в ответе уже отпала

Цитата
.....пока дождешься чей то помощи то сам все решишь
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.