Форум программистов, компьютерный форум, киберфорум
Assembler: i8080/8085/KP580
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 17
1

Нахождение наибольшего однобайтового числа, расположенного в памяти, начиная с адреса 08FFН по 0905Н

18.06.2015, 21:19. Показов 891. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача:
Написать программу нахождения наибольшего однобайтового числа, расположенного в памяти, начиная с адреса 08FFН по 0905Н.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
org 800
mvi d, 7
lxi h, 8ff
mov b, m
 
loop:
mov a, m
cmp b
jm skip
mov b, a
skip:
inx h
dcr d
jnz loop
hlt
В ячейки забиваем:
03 02 01 05 84 13 25
соответственно нашим адресам.
Результат является число 84, что в переводе в DEC = -124.
Помогите!!! Где ошибка в коде?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2015, 21:19
Ответы с готовыми решениями:

Записать дополнительный код содержимого 16 ячеек памяти, начиная с адреса 910. Результаты занести в ячейки памяти, н
Записать дополнительный код содержимого 16 ячеек памяти, начиная с адреса 910. Результаты занести в...

В оперативной памяти вектор int X[10] расположен, начиная с адреса B7F0
Задание 1. В оперативной памяти вектор int X расположен, начиная с адреса B7F0. Какие значения...

Функция должна вывести cnt битов, расположенных в памяти, начиная с адреса addr
дана функция: void dump(void* addr, int cnt); Функция должна вывести cnt битов, расположенных в...

Нахождение динамического адреса в памяти
В проге Cheat Engine нашел один адрес - он динамический. Сгенерировал на него поинтер ->...

3
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
18.06.2015, 21:44 2
Цитата Сообщение от Shean Посмотреть сообщение
cmp b
jm skip
Очевидно здесь. Когда mov a, m загружает число 84 команда cmp производит вычитание
84 - 05 = 7F
и выставляет флаги по результату. Результат получается положительным и jm не срабатывает.
1
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 17
18.06.2015, 21:53  [ТС] 3
Я для этого этот пример и привел. Как избежать данной проблемы?
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
18.06.2015, 23:35 4
У процессора 8080 есть в слове состояния флаг переноса, но нет флага переполнения.
Следовательно, беззнаковые числа в нем сравнивать легко, а вот знаковые не такое просто дело.

Добавлено через 1 минуту
Смоделируем ситуацию на персоналке. Вот если запустить такую программу
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    Model   Tiny
    .Code
    Org 100h
Start:
    mov dx, offset TextNet
 
    xor cx, cx
testing:
    mov ah, 0
                cmp cl, ch
                jl  @
    mov ah, 1
@:  mov al, 0
                cmp cl, ch
                rcr bl, 1
                xor bl, cl
                xor bl, ch
                js  @@
    mov al, 1
@@: cmp al, ah
    jne Print
    loop    testing
 
    mov dx, offset TextDa
 
Print:  mov ah, 9
    int 21h
    ret
 
TextDa  db  'Vse verno$'
TextNet db  'Ne verno$'
 
    End Start
, то она выдаст Vse verno. А в ней я перебрал все возможные сочетания двух байт.

Добавлено через 38 секунд
Следовательно имеем эквивалент для сравнения знаковых без использования флага переполнения.

Добавлено через 1 минуту
У персоналки вот это
Assembler
1
2
    cmp cl, ch
    jl  @
можно заменить на вот это
Assembler
1
2
3
4
5
    cmp cl, ch
    rcr al, 1
    xor al, cl
    xor al, ch
    js  @@
Вот в таком духе тебе и надо сравнивать знаковые в своей программе.

Добавлено через 4 минуты
Т.е. логика к примеру такая. Если знаки сравниваемых чисел одинаковые, то сравнение должно быть
Assembler
1
2
3
mov a, m
cmp b
jc skip
а если разные, то наоборот
Assembler
1
2
3
mov a, m
cmp b
jnc skip
Добавлено через 7 минут
Плохо то, что я ассемблера 8080 почти не знаю. Хотя знаю ассемблеров
разных процессоров ... Но вроде-бы так :
Assembler
1
2
3
4
5
6
    MOV A,M
    CMP B
    RAR
    XRA M
    XRA B
    JM skip
2
18.06.2015, 23:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2015, 23:35
Помогаю со студенческими работами здесь

В оперативной памяти вектор int Х[10] расположен, начиная с адреса B7F0. Какие значения примут выражения
В оперативной памяти вектор int Х расположен, начиная с адреса B7F0. Какие значения примут...

Нахождение статического адреса в памяти процесса
Всем привет, может кто-нибудь помочь найти статический адрес в памяти процесса при помощи c#...

Нахождение адреса стороннего процесса в виртуальной памяти
Для нахождения адреса текущего процесса существует GetSystemInfo с...

Нахождение наибольшего числа из F, B, C, D
Суть задачи: найти наибольшее число. Насколько я понял, надо из 16 в 10 систему перевести и просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru