Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2022, 12:24   #1
gingerswaltz
Новичок
Джуниор
 
Регистрация: 15.12.2022
Сообщений: 3
По умолчанию Разработать программу для вывода на экран произвольного однобайтного знакового целого числа (сделано на 70%) FASM

Код:
format mz
org 100h
mov bl, 10
neg [x]
mov dl, [x]
mov dh,0
mov di, str1
add di,4
mov al, '$'
mov ah,0
push ax

label1:
mov ax,dx
div bl
mov dl,al
mov dh,0
mov al,ah
add al,0x30
mov ah,0
push ax
cmp dl,0
jne label1

label2:
pop ax
stosb
cmp al, '$'
jne label2

mov ah,09h
mov dx, str1
int 21h
mov ah, 01h
int 21h
mov ah, 4ch
mov al, 0
int 21h


x db -1
str1 db "x = "
Приветствую! Синтаксис FASM. Помогите пожалуйста разобраться, как мне вывести знаковое число.. Если x==+1, то всё в порядке, выводится как надо. А здесь я смог реазлизовать только модуль числа, теперь мне надо что то сделать с минусом, как то его добавить..
gingerswaltz вне форума Ответить с цитированием
Старый 15.12.2022, 12:34   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Если старший (7-й) бит = 1, то:
- вывести знак -
- получить модуль числа (neg)
- и вывести его как беззнаковое (см. выше - если там правильно, я не смотрел.)
digitalis на форуме Ответить с цитированием
Старый 15.12.2022, 16:51   #3
gingerswaltz
Новичок
Джуниор
 
Регистрация: 15.12.2022
Сообщений: 3
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Если старший (7-й) бит = 1, то:
- вывести знак -
- получить модуль числа (neg)
- и вывести его как беззнаковое (см. выше - если там правильно, я не смотрел.)
Подскажите пожалуйста как мне достать знак после того как я его закинул… Ну и соответственно как закинуть. И потом прицепить его к беззнаковому числу (модулю)

Я буду рад всему - и ссылкам и кускам кода
gingerswaltz вне форума Ответить с цитированием
Старый 15.12.2022, 18:38   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

1) Почему format mz и одновременно org 100h. Если вам нужен COM файл, тогда первая строка лишняя.
2) Знак числа можно определить даже командой test dl, dl. Если старший бит равен 1, тогда fl.sf - флаг знака станет равен 1 и сработает команда перехода js
Код:
mov bx, str1
mov al, ptr x
test al, al
jns @f
mov byte [bx], '-'
neg al
inc bx
@@:
3) Знаковом числе типа byte не более 3-х разрядов. Зачем для 2-х операций деления писать цикл и мудрить с индексами, чтобы развернуть число в буфере. Не проще сделать последовательно два деления и две проверки.

4) т.к. это COM программа и работает она под DOS, тогда для работы с числами размером byte есть замечательные команды aaa/aam/aad/aas/daa/das
Код:
mov cx, 100
xor dx, dx
mov ah, 0
div cx
add al, 48
cmp al, 48
jz @f
mov [bx], al
inc bx
@@:
xchg ax, dx
aam 10
add ax, 48 * 256 + 48
cmp dl, 48 ; Если старший разряд не нулевой, тогда в центре числа есть значащий 0. Например: 105
jnz .show
cmp ah, 48
jz @f
.show:
mov [bx], ah
inc bx
@@:
mov ah, '$'
mov [bx], ax ; Даже если цифра равна 0, тогда все равно ее отображаем. нет смысла проверять на ноль и ее тоже

Последний раз редактировалось macomics; 15.12.2022 в 18:41.
macomics вне форума Ответить с цитированием
Старый 19.12.2022, 09:08   #5
gingerswaltz
Новичок
Джуниор
 
Регистрация: 15.12.2022
Сообщений: 3
По умолчанию

Код:
format mz
org 100h
mov di, str1
add di,4
movsx ax, [x]
 
   test    ax,ax
   jns     oi1
 
 
 
oi1:
 
         xor     cx,     cx              ;int count=0;
        test    al,     al              ;if(n<0)
        jns     @f                      ;{
                mov     [di],   byte '-';  putch('-');
                inc     di
                neg     al              ;  n = -n;
        @@:                             ;};
        mov     bh,     10
        @@:                             ;do{
                xor     ah,     ah      ;  int reminder= n%10;
                div     bh              ;  n = n /10;
                add     ah,     '0'     ;  push(reminder+'0');
                mov     bl,     ah
                push    bx
                inc     cx              ;  count++;
                test    al,     al
        jnz     @b                      ;}while(n==0)
                                        ;
        @@for:                          ;for( ;count>0; count--)
                                        ;{
                pop     ax              ;  pop(c);
                stosb                   ;  putch(c)
        loop    @@for                   ;}
        mov     al,     '$'
        stosb
 
 
 
mov ah,09h
mov dx, str1
int 21h
mov ah, 01h
int 21h
mov ah, 4ch
mov al, 0
int 21h
 
 
x db -123
str1 db "x =   "
buffer db 0

Рабочая финальная версия программы. Прошу закинуть в закреп
gingerswaltz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как напишите программу, суммирующую числа от 0 до указанного целого положительного числа Диана1998 Microsoft Office Excel 1 25.11.2016 16:09
Написать программу ввода/вывода одномерного массива произвольного размера,... 4edder Паскаль, Turbo Pascal, PascalABC.NET 1 06.05.2014 20:09
Создать в редакторе текстовый файл, внести в него 10 строк произвольного текста. Разработать программу, к Pan_rust Паскаль, Turbo Pascal, PascalABC.NET 0 24.05.2010 23:04
разработать функцию, которая определяет сумму цифр целого числа IceAgainstIce Общие вопросы Delphi 5 20.11.2008 00:52