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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2016, 21:32   #1
Нести
Новичок
Джуниор
 
Регистрация: 30.10.2016
Сообщений: 1
Восклицание Помогите пожалуйста. Задание такое: написать макросы для перевода числа в строку, для вывода строки на терминал, для остановки программы. Код приведен ниже. Укажите пожалуйста что

Код:
DATA SEGMENT use16
.model small
.stack 100h
.data
     arg dd 45678
     str db ?
.code
.386
.proc:
     mov ax,@data
     mov ds,ax
print MACRO str
Local p1
     mov di,offset number
     mov ax,[di]
     mov dx,[di+2]
     mov ax,10
     xor cx,cx
p1:
     div bx
     inc cx
     add dl,30h
     mov dx,0
     push dx
     mov dx,0
     cmp ax,0
     jnz p1
     mov bx,0
p2:
     mov ah,2
     pop dx
     mov [str+bx],dl
     inc bx
     loop p2
     ENDM
wait_for_key MACRO
local p2
     mov [str+bx],'$'
     mov ah,09h
     mov dx,offset str
     inc 21h
     ENDM
exit MACRO
     mov ah,4ch
     inc 21h
     ENDM
ENDM proc

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 01.11.2016 в 09:31.
Нести вне форума Ответить с цитированием
Старый 01.11.2016, 09:26   #2
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Как минимум надо использовать тег [ code ].
И опечатки типа: mov ax,10 + div bx, mov dx,0 + push dx.

Вот хороший вариант. Меняешь proc на macro, убираешь ret и делаешь push/pop, если надо сохранить регистры. Если хочется, добавляешь параметр и mov ax,параметр.
Код:
;***********************************************
;*  ПРОСТЫЕ ПРОЦЕДУРЫ ПЕРЕВОДА ЧИСЛА В СТРОКУ  *
;*    (c) 2016 by Jin X (jin.x@sources.ru)     *
;***********************************************

locals  ; использовать локальные метки @@

;-- Вывод целого знакового десятичного числа на экран --------------------------
; Вход: AX = число
; Меняет регистры AX, BX, CX, DX и флаги
IntToScr equ SIntToScr
SIntToScr proc
  or ax,ax
  jns @@nosign  ; переход, если число положительное
  xchg cx,ax
  mov al,'-'
  int 29h
  xchg cx,ax
  neg ax  ; и меняем знак ax
@@nosign:

;-- Вывод целого БЕЗзнакового десятичного числа на экран -----------------------
; (данная процедура является лишь точкой входа внутри процедуры SIntToScr)
; Вход: AX = число
; Меняет регистры AX, BX, CX, DX и флаги
UIntToScr proc
  xor cx,cx
  mov bx,10  ; система счисления
@@nextdigit:
  xor dx,dx  ; dx = 0 (нужно для деления)
  div bx  ; ax = dx:ax/систему_счисления, dx = остаток
  push dx  ; сохраняем цифру в стеке
  inc cx  ; увеличиваем кол-во цифр
  or ax,ax
  jnz @@nextdigit  ; переход, если частное ещё не равно 0
@@outdigit:
  pop ax  ; извлекаем цифру из стека
  add al,'0'  ; преобразуем её в символ
  int 29h  ; вывод цифры
  loop @@outdigit  ; повторяем цикл вывода символов
  ret  ; выход из процедуры
UIntToScr endp
SIntToScr endp

;-- Преобразование целого знакового десятичного числа в строку -----------------
; Вход: AX = число, ES:DI = адрес для записи строки
; Выход: ES:DI = следующий символ за строкой (включая IntToStrFinChar)
; Меняет регистры AX, BX, CX, DX и флаги
IntToStr equ SIntToStr
SIntToStr proc
  or ax,ax
  jns @@nosign  ; переход, если число положительное
  xchg cx,ax
  mov al,'-'
  stosb  ; иначе выводим минус
  xchg cx,ax
  neg ax  ; и меняем знак ax
@@nosign:

;-- Преобразование целого БЕЗзнакового десятичного числа в строку --------------
; (данная процедура является лишь точкой входа внутри процедуры SIntToStr)
; Вход: AX = число, ES:DI = адрес для записи строки
; Выход: ES:DI = следующий символ за строкой (включая IntToStrFinChar)
; Меняет регистры AX, BX, CX, DX и флаги
UIntToStr proc
  xor cx,cx
  mov bx,10  ; система счисления
@@nextdigit:
  xor dx,dx  ; dx = 0 (нужно для деления)
  div bx  ; ax = dx:ax/систему_счисления, dx = остаток
  push dx  ; сохраняем цифру в стеке
  inc cx  ; увеличиваем кол-во цифр
  or ax,ax
  jnz @@nextdigit  ; переход, если частное ещё не равно 0
@@outdigit:
  pop ax  ; извлекаем цифру из стека
  add al,'0'  ; преобразуем её в символ
  stosb  ; вывод цифры
  loop @@outdigit  ; повторяем цикл вывода символов
  ret  ; выход из процедуры
UIntToStr endp
SIntToStr endp
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 01.11.2016 в 09:34.
7in вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите пожалуйста с объяснением кода что для чего. VasyaSam Visual C++ 2 22.12.2013 16:18
Помогите пожалуйста написать макрос для Excel fafolo4ka Microsoft Office Excel 1 22.12.2009 19:17
Пожалуйста помогите сделать задание для зачето по Интернет Технологиям DiSpalL Помощь студентам 1 29.05.2009 15:00
Помогите пожалуйста написать проверку ввода для этой программы Saaashka Помощь студентам 1 01.07.2008 09:11