LINUX.ORG.RU

some more asm+dos ;)


0

0

1. Как добавить к строке знак? Например:

text1 db "bla", 0

Хочется иметь в text1 не "blabla" а "blabla$"

2. Как выписать на консоль строку которая не кончается '$' или просто один знак?

Так:
mov ah, 9h
mov dx, offset text1
int 21h

Можно выписать только если text1 кончатеся на '$'...

Попробуй писать не через BIOS а напрямую в видеопамять.

OxiD ★★★★
()

1. Хмм удалось только так:

text1 db "wtf"
mov text1+3, '$'; '\0' -> '$'

Но непонятно из этого как более общо работать со строками/массивами, скажем иметь в .data не

text1 db ?

только что-то вроде

text1 db size(512)

чтобы иметь эти 512 байт?

2. Нашел. Вроде как за выписание знака отвечает int 21h с функцией 02h:

mov dl, 'z'
mov ah, 2h
int 21h

dissident ★★
() автор топика
Ответ на: комментарий от dissident

Кроме 21-го прерывания существует ещё много других. В частности - 10h. Там имхо были функции для вывода строк/символов с несколько другим форматом нежели у ДОС.

Ximen ★★★★
()
Ответ на: комментарий от dissident

>1. Хмм удалось только так:
>text1 db "wtf"
>mov text1+3, '$'; '\0' -> '$'

все гораздо проще:
text1 db "wtf",'$'


>Но непонятно из этого как более общо работать со строками/массивами, >скажем иметь в .data не
>text1 db ?
>только что-то вроде
>text1 db size(512)
>чтобы иметь эти 512 байт?

тоже ничего сложного, при этом неинициализированные данные объявлять лучше в специальном месте:
.data? ; сообщает компилятору что здесь неинициализированные данные
text1 db 512 dup (?)
text2 db 256 dup (?)
тем самым размер конечного файла не увеличится.
.data ; здесь инициализированные данные
text3 db "мама мыла раму",'$' ; для вывода через 9 ф-ию ДОС
text4 db "рама мыла маму",0 ; строка в си стиле - для вывода требуется своя библиотека
например так:


; на входе di = адрес строки
StrZWrite proc
; сохраняем изменяемые регистры
push ax
push bx
push cx
push dx
push di

; определяем длину строки
xor al,al
mov cx,0ffffh
cld
repnz scasb
not cx
dec cx ; cx = длина строки без завершающего нуля
; вывод на экран
mov bx,1 ; 1-для ДОС стандартное у-во вывода
pop di
mov dx,di ; dx = адрес строки, в данном случае dx=di
mov ah, 40h
int 21h
; на выходе из этого прерывания ax = количество записанных символов и
; поидее можна убрать
; в начале и конце push ax и pop ax чтобы была возможность
; анализировать правильность выполнения процедуры


; восстанавливаем регистры
pop dx
pop cx
pop bx
pop ax
; возврат к месту вызова
ret
StrZWrite endp


; пример использования

.code

mov ax,@data
mov ds,ax
mov es,ax

mov dx,offset str3
mov ah,09h ; вывод строки в ДОС стиле
int 21h

mov di,offset str4
call StrZWrite ; вывод строки в си стиле

anonymous
()
Ответ на: комментарий от anonymous

Понятна что если выводить строки в си стиле то знак $ тоже легко нарисуется:
; 10 - прогон строки
; 13 - возврат каретки
; 10,13 - эквивалент "\n" в си для ДОС (напомню в UNIX достаточно 10 или 13 точна не помню :)
.data
str5 db "мыло мамит раму",'$',10,13,0
.code

mov di,offset str5
call StrZWrite ; вывод строки в си стиле

anonymous
()
Ответ на: комментарий от anonymous

и еще в качестве ликбеза - разница между lea и offset lea - команда процессора - загрузить эффективный адрес - загружает в регистр смещение адреса ссылки к памяти при выполнения программы offset - директива ассемблера означающая подставить смещение некоторой метки - смещение вычисляется на этапе компиляции

lea чаще всего используют при доступе к массивам памяти (таблицам) например: ... add si,STEP lea bx,[array+si] ... array - адрес начала массива

при доступе к простым строках эффективнее использовать offset - так как адрес вычисляется на этапе компиляции код получится компактней и быстрей.

И вообще- стоит попробовать использовать родной синтаксис tasm - директива IDEAL в начале программы - например TASM с версии 3.0 или позднее точна не помню поддерживает объектно-ориентированное программирование :) для чего это нужны - думай сам :) раньше некоторые люди игрушки писали используя ООП tasm которые при неплохой графике летали на 286

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.