Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
1

Показать на экране введенное числовое значение в hex-виде

30.04.2016, 05:39. Просмотров 847. Ответов 30
Метки tasm (Все метки)

Написал программу, выдает ошибки. Не знаю как их исправить, и вроде как из-за одной остальные и появились.Помогите пожалуйста их исправить.
----------------------------------------------------------------------------------------------------------------------------------------
Задача:
Двуйбайтный код вводится с клавиатуры в двоичном виде. Показать на экране его числовое значение в hex виде.

Мой код

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
.386
dseg segment use16
    text1 db 13,10 'Type BIN: $'
    text2 db 13,10 0Dh,0Ah,'Result..: ',0Dh,0Ah,'$'
    Buf db 17,18 dup(?)
dseg ends
 
cseg segment use16
assume cs:cseg, ds:dseg
 
m1:
    mov cx,dseg
    mov ds,cx
 
    mov ah,9    
    lea DX,text1
    int 21h
    mov ah,0Ah
    lea DX,Buf
    int 21h
    mov DX,DS:Buf
    lea Di,DS:Buf+2
    mov CX,DS:Buf+1
m2:
    cmp DS:[DI],31h
    jne short m3 ;если не равно
    or AX, 00000001b
m3:
    shl AX,1
    inc DI
    loop m2
    mov ah,9
    lea DX,text2
    int 21h
    mov DX,AX
    call PECHAT
 
    ;Печатает символ и переводит курсор на позицию вправо
WRITE proc 
      mov AH,9
      xor BH,BH
      mov BL,07H
      ;mov CX,1
      mov AL,DL
      int 10h
      inc DL
      ret
WRITE endp
    
    ;Печатает одну шестнадцатеричную цифру (младшую тетраду DL)
    ;(старшая тетрада должна быть равна 0)
    ;DL - цифра
NA_CONSOL proc
        cmp  DL,0Ah
        jae  BUKVA
        add  DL,30h
        JMP  POKAZ
    BUKVA:
        add  DL,37h
    POKAZ:
      call WRITE     ;             ------ СДЕЛАТЬ ПЕЧАТЬ
      ret
NA_CONSOL endp
 
    ;Печатает две шестнадцатеричные цифры
RASHIREN proc
      mov  DH,DL
      mov  CL,4
      shr  DL,CL
      call NA_CONSOL
      mov  DL,DH
      and  DL,0Fh
      call NA_CONSOL
      ret
RASHIREN endp
    
PECHAT proc ;двухбайтное число на консоль
        mov CX,DX
        call RASHIREN
        xchg DL,CH
        call RASHIREN
        ret
PECHAT endp
 
cseg ends 
end PECHAT
;Завершаем программу 
mov ah, 4ch
int 21h
cseg ends
end m1
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2016, 05:39
Ответы с готовыми решениями:

Показать на экране в hex-виде байты массива, значения которых больше заданного числа
Сегмент данных содержит массив из 12-ти однобайтных кодов. С клавиатуры вводится однобайтный код в...

Отображение на экране значений головного и хвостового указателей кольцевого буфера в виде hex строк
Отображение на экране значений головного и хвостового указателей кольцевого буфера в виде...

Напишите программу, которая читает с клавиатуры числовое значение x и выводит на экран значение функции f(x)
Добрый день! имеется следующая задача: Напишите программу, которая читает с клавиатуры числовое...

Числовое значение из одного textbox-а разделить на значение из другого
вот код программы: private void button1_Click(object sender, EventArgs e) { ...

Показать на экран введенное нечетные цифры
У меня Вот такая вот задача: показать на экран не число а введенное нечетные цифры Сам прога В...

30
MansMI
1457 / 1165 / 551
Регистрация: 08.01.2012
Сообщений: 4,509
30.04.2016, 05:47 2
всего не читал, но
Assembler
1
2
3
mov cx,dseg
.........
mov CX,DS:Buf+1
по этому адресу интересен только один байт, что сейчас в СН?
1
proc3nt
волшебник
1298 / 555 / 177
Регистрация: 26.05.2012
Сообщений: 1,591
30.04.2016, 10:58 3
Цитата Сообщение от balin Посмотреть сообщение
text1 db 13,10 'Type BIN: $'
запятую надо бы поставить
Assembler
1
text1 db 13,10,'Type BIN: $'
Цитата Сообщение от balin Посмотреть сообщение
text2 db 13,10 0Dh,0Ah,'Result..: ',0Dh,0Ah,'$'
и здесь тоже
Assembler
1
text2 db 13,10,0Dh,0Ah,'Result..: ',0Dh,0Ah,'$'
Добавлено через 1 минуту
не хватает сегмента стека в программе
Assembler
1
2
3
sseg segment stack
    db 256 dup(?)
sseg ends
2
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
30.04.2016, 11:09  [ТС] 4
MansMI, Я просто делал, по учебникам, и на сколько я понял в
mov CX,DS:Buf+1
будет лежать число введенных символов
0
30.04.2016, 11:09
MansMI
1457 / 1165 / 551
Регистрация: 08.01.2012
Сообщений: 4,509
30.04.2016, 11:15 5
Цитата Сообщение от balin Посмотреть сообщение
будет лежать число введенных символов
это легко проверить, или td.exe сломался?
0
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
30.04.2016, 11:23  [ТС] 6
proc3nt, Спасибо, только а для чего третий сегмент?
И у меня все равно остались ошибки(((

Добавлено через 1 минуту
MansMI, Так я его же не могу запустить, чтобы его запустить я же сначала делаю файл с obj
а потом .exe
А для этого ошибок не должно быть. А они у меня есть

Добавлено через 5 минут
Вот мой сейчас не много исправленный вариант, но тут все равно остались ошибки
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
.386
dseg segment use16
    text1 db 13,10,'Type BIN: $'
    text2 db 13,10,0Dh,0Ah,'Result..: ',0Dh,0Ah,'$'
    Buf db 17,18 dup(?)
dseg ends
 
sseg segment stack use16
    db 256 dup(?)
sseg ends
 
cseg segment use16
assume cs:cseg, ds:dseg,ss:sseg
 
m1:
    mov cx,dseg
    mov ds,cx
 
    mov ah,9    
    lea DX,text1
    int 21h
    mov ah,0Ah
    lea DX,Buf
    int 21h
    mov DX,DS:Buf
    lea Di,DS:Buf+2
    mov CX,DS:Buf+1
m2:
    cmp DS:[DI],31h
    jne short m3 ;если не равно
    or AX, 00000001b
m3:
    shl AX,1
    inc DI
    loop m2
    mov ah,9
    lea DX,text2
    int 21h
    mov DX,AX
    call PECHAT
    mov ah, 4ch
    int 21h
 
    ;Печатает символ и переводит курсор на позицию вправо
WRITE proc 
      mov AH,9
      xor BH,BH
      mov BL,07H
      ;mov CX,1
      mov AL,DL
      int 10h
      inc DL
      ret
WRITE endp
    
    ;Печатает одну шестнадцатеричную цифру (младшую тетраду DL)
    ;(старшая тетрада должна быть равна 0)
    ;DL - цифра
    ;--------------------------------------------------------
NA_CONSOL proc
        cmp  DL,0Ah
        jae  BUKVA
        add  DL,30h
        JMP  POKAZ
    BUKVA:
        add  DL,37h
    POKAZ:
      call WRITE     ;             ------ СДЕЛАТЬ ПЕЧАТЬ
      ret
NA_CONSOL endp
 
    ;Печатает две шестнадцатеричные цифры
RASHIREN proc
      mov  DH,DL
      mov  CL,4
      shr  DL,CL
      call NA_CONSOL
      mov  DL,DH
      and  DL,0Fh
      call NA_CONSOL
      ret
RASHIREN endp
    
PECHAT proc ;двухбайтное число на консоль
        mov CX,DX
        call RASHIREN
        xchg DL,CH
        call RASHIREN
        ret
PECHAT endp
 
cseg ends 
end m1
0
proc3nt
волшебник
1298 / 555 / 177
Регистрация: 26.05.2012
Сообщений: 1,591
30.04.2016, 11:47 7
Цитата Сообщение от balin Посмотреть сообщение
mov DX,DS:Buf
lea Di,DS:Buf+2
mov CX,DS:Buf+1
если указывается конкретный сегментный регистр, то смещение в нем после двоеточия ставится в квадратных скобках. количество введенных символов занимает один байт. так что не забываем про преобразование типов.
максимально возможное количество вводимых символов в принципе нам далее нигде не понадобится
Assembler
1
2
3
lea di,ds:[Buf+2]
xor ch,ch
mov cl,byte ptr ds:[Buf+1]
1
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
30.04.2016, 11:56  [ТС] 8
proc3nt, Ого спасибо большое.
У меня одна ошибка осталась 1. argument needs type override -
cmp DS:[DI],31h
0
proc3nt
волшебник
1298 / 555 / 177
Регистрация: 26.05.2012
Сообщений: 1,591
30.04.2016, 12:09 9
Лучший ответ Сообщение было отмечено balin как решение

Решение

Цитата Сообщение от balin Посмотреть сообщение
cmp DS:[DI],31h
некорректное приведение типа
Assembler
1
cmp byte ptr ds:[di],31h
p.s. но рано не радуйтесь. по-моему здесь еще болото логических ошибок, которые компилятор не заметит

взято с wikipedia:
в программировании логической ошибкой называется баг, который приводит к некорректной работе программы, но не к краху программы. В отличие от синтаксических ошибок, программы с логическим изъяном являются правильными программами, хотя в большинстве случаев ведут себя не так, как задумано первоначально.
1
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
30.04.2016, 12:13  [ТС] 10
proc3nt, аааааа, спасибо большое!!1!!
Ну логические надеюсь, сам смогу исправить, фух.
0
proc3nt
волшебник
1298 / 555 / 177
Регистрация: 26.05.2012
Сообщений: 1,591
30.04.2016, 12:21 11
неплохо было бы обнулить регистр ax, в который накапливаются биты, перед меткой m2
Assembler
1
2
xor ax,ax
m2:
1
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
30.04.2016, 12:24  [ТС] 12
proc3nt, хорошо, сейчас сделаю
И да , работает она криво, точнее не работает, ахах.
0
Миниатюры
Показать на экране введенное числовое значение в hex-виде  
proc3nt
волшебник
1298 / 555 / 177
Регистрация: 26.05.2012
Сообщений: 1,591
30.04.2016, 12:38 13
Цитата Сообщение от balin Посмотреть сообщение
m2:
...
loop m2
проблема будет и внутри тела m2. если следующий байт 30h, то все норм. но если следующий байт 31h, то единичный бит будет затирать младший бит регистра ax. так что сдвиг регистра ax на один бит влево должен предшествовать установке нового бита в младший бит регистра ax в обоих случаях
Assembler
1
2
3
4
5
6
7
8
9
10
11
m2:
    shl ax,1
 
    cmp byte ptr ds:[di],31h
    jne short m3
    
    or ax,00000001b
    
    m3:
    inc di
loop m2
1
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
30.04.2016, 12:51  [ТС] 14
proc3nt,
Хм, я понял, спасибо.
--------------
Пытаюсь сейчас найти ,где что-то идет не так, пока успехом особо нет.
0
proc3nt
волшебник
1298 / 555 / 177
Регистрация: 26.05.2012
Сообщений: 1,591
30.04.2016, 12:54 15
Цитата Сообщение от balin Посмотреть сообщение
mov ah,9
lea DX,text2
int 21h
mov DX,AX
после прохода цикла m2 в регистре ax будет введенное нами число. ты его затем затираешь, используя функцию вывода строки на экран. хотя оно нам дальше понадобится
Assembler
1
2
3
4
5
6
7
push ax
 
mov ah,09h
lea dx,text2
int 21h
 
pop dx
1
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
30.04.2016, 13:03  [ТС] 16
proc3nt, А с помощью push мы заносим временно AX, pop восстанавливается значение ,понял.
Еще ,как я понял в процедуре WRITE идет затирание какое то.
0
proc3nt
волшебник
1298 / 555 / 177
Регистрация: 26.05.2012
Сообщений: 1,591
30.04.2016, 13:32 17
Цитата Сообщение от balin Посмотреть сообщение
PECHAT proc
mov CX,DX
call RASHIREN
xchg DL,CH
call RASHIREN
ret
PECHAT endp
почему ты сначала выводишь младший байт результата, а только потом старший? надо бы все наоборот
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
pechat proc
    push dx
    xchg dh,dl
    
    call rashiren
    
    pop dx
    
    call rashiren
 
    ret
pechat endp
1
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
30.04.2016, 13:35  [ТС] 18
proc3nt, блин. Получается мне и DX в CX не нужно сохранять т.к его можно воcстановить.
0
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
30.04.2016, 13:44  [ТС] 19
ничего себе, уже ближе к ответу, хахах
0
Миниатюры
Показать на экране введенное числовое значение в hex-виде  
proc3nt
волшебник
1298 / 555 / 177
Регистрация: 26.05.2012
Сообщений: 1,591
30.04.2016, 13:53 20
сделай процедуру write попроще
Assembler
1
2
3
4
5
6
write proc
    mov ah,02h
    int 21h
    
    ret
write endp
1
30.04.2016, 13:53
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2016, 13:53

Преобразовать введенное значение в часы и минуты и выводит на экран в виде “часы: минуты”
Здравствуйте, помогите пожалуйста с написанием программы. Написать программу, которая запрашивает...

Цикл: Показать к какому номеру относится введенное число.
Такая проблема! необходимо с помощью цикла вычислить от 1 до 10 (№1 ) от 10 до 20 (№2 ) от 20...

Конвертация в числовое значение.
Имеется поле textBox1 в котором записано некое число, которое равно 50. Как присвоить это значение...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.