помогите пожалуйста. Подскажите что неправильно.
мне надо посчитать значения функции Y=(x-5)+x/8, где x=0..9
вот что я сделал
procedure Sup(i:smallint);
begin
Form1.Memo1.Lines.Add(inttostr(i))
end;
procedure TForm1.Button1Click(Sender: TObject);
Var j:integer;
begin
memo1.Clear;
asm
mov ecx,9
mov ebx,1
@L:
mov edx,ebx
sub edx,5
mov eax,ebx
div 2
add eax,edx
inc ebx
push ecx
call Sup
Loop @L
end;
end;
end.
вообще как делить поясните плиз… Буду благодарен.
25 декабря 2008 в 21:05
люди помогите пож-та….нужно узнать количество ненулевых символов в строке…..на вход бинарная строка не более 32 бит, вводимая с клавы…на выходе количество единиц в 10-ой системе….самое начало есть….но что то, блин, не могу никак осуществить….:((
.model small
.8087
.data
msgin db " введите бинарную строку",0dh,0ah,'$'
msgrez db " вы ввели ",0dh,0ah,'$'
msgenddb "для завершения нажмите Enter",0dh,0ah,'$'
newstrdb 0dh,0ah,'$'
Vvoddb 44 dup (0) ,0dh,0ah,'$';"????????????
len_Buffer = $-Vvod
db" "
db 0dh,0ah,'$'
.code
start:
mov ax,DGROUP
mov ds,ax
; вывод сообщения
mov dx,offset msgin
mov ah,9
int21h
; ввод символа с клавиатуры
mov bx, 0
mov dx, offset Vvod
mov ah, 3fh
int 21h
; перевод курсора на след строку
mov dx,offset newstr
mov ah,9
int 21h
; вывод сообщения
mov dx,offset msgrez
mov ah,9
int21h
mov dx,offset Vvod
mov ah,9
int21h
; перевод курсора на новую строку
mov dx,offset newstr
mov ah,9
int21h
; вывод сообщения
mov dx,offset msgend
mov ah,9
int21h
; ввод символа с клавиатуры
mov bx, 0
mov dx, offset Vvod
mov ah, 3fh
int21h
;……………………………………………………………………….
;*******************************************************
; завершение работы программы
mov ax,4c00h
int 21h
end start
;*******************************************************
23 декабря 2008 в 10:02
2 Антон Щиров
<В Делфи, если не указано обратное, стоит модель вызова register>
Разве? Хм, надо что ли справочники поднять – освежить память )
23 декабря 2008 в 1:01
2 Александр Пинский
>> Далее, команду push вижу, команду pop нет
> Тут, как раз, по-моему всё нормально – паскалевский вызов процедур сам чистит стек перед возвратом.
В Делфи, если не указано обратное, стоит модель вызова register, т.е. первые три параметра передаются через eax, edx, ecx
> Гораздо больше настораживает другое – если не ошибаюсь, smallint имеет размер в 2 байта, а push ecx помещает в стек 4 байта.
Это уже мелочи, учитывая тот факт, что параметр ищется в ax, а не в стеке ))
22 декабря 2008 в 21:01
я не знаю как ето сделать :'(
22 декабря 2008 в 21:00
да…….. подробнее))))))
как можно подробнее))))))
22 декабря 2008 в 20:05
2 Альона ЧуДушко Monastyretskaya
<сделала вид, что поняла, что такое "отладчика защищённого режима ">
Радуйся, что не знаешь – от этого крыша может съехать
Теперь более-менее понятно:
1. Нужно написать, как всё это дело будет выглядеть после трансляции в машинный код.
2. Это как я понимаю из серии "Косвенная со смещением", "Коссвенная с базой и смещением" и т.д.
3. Для каждой операции, обращающейся к памяти, написать логический адрес (сегмент:смещение) и физический (сегмент*16+смещение)
4. Показать, как меняется содержимое регистров и памяти после выполнения каждой команды (типа, в регистре было число 5, добавили 4 и получили 9)
Понятно, или подробнее написать?
22 декабря 2008 в 20:02
ага *сделала вид, что поняла, что такое "отладчика защищённого режима "*
X DW 04, OE593H, -22. ODDC5H, 07
DQ OA34A43523AH, 41E792H
Y DW 25, 79CCH, -78, 02B3H, 06, OD5H
DQ 2D59265912H, OE8DE7EB92BH
BEGIN:
LEA DI, X
LEA SI, Y
MOV CX,[DI]+15
MOV BX,[SI]+26
ADD CX, BX
MOV BX,OD412H
MOV AX,[BX+SI+2BFFH]
и вот с этим надо:
—-отобразить представление исходных данных и команд в виде непрерывного фрагмента оперативной памяти (16-ричная система счисления),
—указать способ адресации операндов,
—вычислить физический, логический адрес адресуемой ячейки,
—отобразить содержимое регистров и памяти после выполнения команд
22 декабря 2008 в 20:01
2 Альона ЧуДушко Monastyretskaya
Можно задание подробнее? А то в такой формулировке смахивает на задание по разработке отладчика защищённого режима (что вряд ли имеет место).
22 декабря 2008 в 19:04
пожалуйста может кто-то помочь с ассемблером?
дана какая-то программа нужно: "указать способ адресации" "вычислить физический, логический адрес ячейки" и "отобразить содержимое регистров и памяти после выполнения команд"
я просто не знаю что с этим делать ( я ооооооочень прошу помогите (
22 декабря 2008 в 17:01
Вообще, если нужно целочисленное деление (без остатка) попробуй такую ассемблерную вставку – может покатит (проверить сейчас не могу, асма под рукой нету)
mov cl, 10 'cl = [10,1]
@calc_loop:
mov al, 10 'al = 10
sub al, cl 'al = 10-cl = x+1
dec al 'al = x
mov ah, al 'ah = x
sub ah, 5'ah = x – 5
sar al, 3'al = x/8 (целочисленно)
add al, ah 'al = x/8 + (x – 5)
xor ah, ah 'ah = 0 -> ax = al = (x-5) + x/8
push ax'Параметр процедуры в стек
call Sup 'Вызов процедуры
dec cl 'Уменьшение счетчика на единицу
jnz @calc_loop 'Переход, если результат последней арифметической операции не ноль
22 декабря 2008 в 16:03
2 Макс Андреев
Тебе делить нужно как целое число (4/8 = 0) или как дробное (4/8 = 0.5)?
2 Антон Щиров
<Далее, команду push вижу, команду pop нет>
Тут, как раз, по-моему всё нормально – паскалевский вызов процедур сам чистит стек перед возвратом.
Гораздо больше настораживает другое – если не ошибаюсь, smallint имеет размер в 2 байта, а push ecx помещает в стек 4 байта. При таком вызове процедуры стек не будет правильно очищен.
22 декабря 2008 в 13:04
Асемблер-жопа!сдала и открестилась и,лично мне,нигде не пригодился..у нас книга была толстая такая,хорошая,где все доступно объяснено,к сожалению автора не помню
22 декабря 2008 в 12:02
СПС Всем… Я сдал архитектуру компа на 4
22 декабря 2008 в 1:00
Вы разве не знаете, что в Delphi можно свободно использовать только регистры EAX, ECX и EDX. Все осстальные надо сохранять и восстанавливать.
Далее, команду push вижу, команду pop нет
Вместо div, в данном случае лучше использовать shr
22 декабря 2008 в 1:00
нет нам не говорили именно про делфи, на чисто про асм что-то рассказывали, а так лабы на делфи делаем, так что вот беда