Сейчас на форуме: bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› помогите найти ошибку в asm коде
Посл.ответ Сообщение

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 февраля 2011 13:15
· Личное сообщение · #1

у меня есть такой код

use16
org 0x7C00

start:
mov ax, cs
mov ds, ax

mov ax,0B800h
mov es,ax


str1 db 'Hello',0
mov si,str1
call print

mov ah,10h
int 16h





mov ax, 5307h ;
xor bx, bx ;
inc bx ; закрытите приложения
mov cx, 3 ;
int 15h ;

;==========================================================
print:
mov di,0
mov ah,7

p2:
lodsb
test al,al
je p1
mov [es:di],ax
add di,2
jmp p2
p1:

ret

;==========================================================
finish:
times 0x1FE-finish+start db 0
db 0x55,0xAA

когда строка такая как сейчас она норм выводится но стит её поменять на чтото другое и всё =((
уже дето час танцую с бубном, а понять не могу почему
пишу на fasme



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 15 февраля 2011 13:45 · Поправил: Veliant
· Личное сообщение · #2

Кто же данные размещает в перемешку с кодом? Вынесите str1 куда нибудь после ret

ARCHANGEL,
Может я что-то не понимаю, но в таком случае делается jmp через данные, а тут проц идет по коду, и потом сразу выходит на строку, отсюда и косяки. Это же не локальная переменная в процедуре




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 15 февраля 2011 13:47 · Поправил: ARCHANGEL
· Личное сообщение · #3

mov [es:di],ax

на

mov [es:di],al

а mov ah,7 убрать. Но не уверен, ибо я родился во времена виндоуз.

Veliant пишет:

Кто же данные размещает в перемешку с кодом? Вынесите str1 куда нибудь после ret

Авторы малвари так делают, и всё пашет. Тут не это главное.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 15 февраля 2011 14:21 · Поправил: =TS=
· Личное сообщение · #4

вместо mov [es:di],ax проще использовать stosw (т.к. используемые ей регистры уже инициализированы)

вместо mov si,str1 попробуй lea si,str1

в начале функции print можешь вставить cld

UPD. Для stosw не забудь убрать add di,2

-----
DREAMS CALL US


| Сообщение посчитали полезным: Sover

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 февраля 2011 14:22 · Поправил: Sover
· Личное сообщение · #5

ARCHANGEL пишет:
mov [es:di],axна mov [es:di],alа mov ah,7 убрать. Но не уверен, ибо я родился во времена виндоуз.

mov ah,7 это белый шрифт на чёрном фоне
mov [es:di],al сделал так но всеравно показывает не все сообщения
например Hello! <-показывает Hello <-не показывает
Hello world <-не показывает Hello world! <- показывает



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 15 февраля 2011 14:30
· Личное сообщение · #6

Повторяю для тех кто в танке.
Твоя строка исполняется как код.

Code:
  1. mov es,ax
  2. str1 db 'Hello',0
  3. mov si,str1


Откуда процессор знает что после mov es,ax идёт какая-то фигня которую исполнять не надо?
Он всё подряд исполняет.

=TS= пишет:
вместо mov [es:di],ax проще использовать stosw

Строковые команды медленные, лучше не использовать.

=TS= пишет:
вместо mov si,str1 попробуй lea si,str1

Это без раницы.

ARCHANGEL пишет:
mov [es:di],ax
на
mov [es:di],al

Это у него правидьно, он символ с атрибутами в видеопамять пишет.
ARCHANGEL пишет:
Авторы малвари так делают, и всё пашет. Тут не это главное.

Ну-ну. Только надо jmp тогда перед строкой ставить чтоб он данные перепрыгнул.

| Сообщение посчитали полезным: Veliant, Sover, bizdon

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 февраля 2011 14:31
· Личное сообщение · #7

=TS= пишет:
вместо mov si,str1 попробуй lea si,str1

Fasm не понимает команду lea



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 15 февраля 2011 14:36
· Личное сообщение · #8

Sover пишет:
Fasm не понимает команду lea

Не верю.



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 февраля 2011 14:40
· Личное сообщение · #9

cppasm пишет:
Повторяю для тех кто в танке.Твоя строка исполняется как код.

Code:


mov es,axstr1 db 'Hello',0mov si,str1


Откуда процессор знает что после mov es,ax идёт какая-то фигня которую исполнять не надо?Он всё подряд исполняет.


спасиба всё плучилось разобрался заработало



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 февраля 2011 14:42
· Личное сообщение · #10

cppasm пишет:
Sover пишет:Fasm не понимает команду lea Не верю.

ну что я те тут могу сказать у меня fasm запущен, я попробовал, он ругнулся"инвалид операнд"



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 15 февраля 2011 14:49 · Поправил: cppasm
· Личное сообщение · #11

Это как бы значит что операнд неправильный, а не команда не поддерживается.
Читайте мануалы:
lea si, [str1]



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 февраля 2011 15:13
· Личное сообщение · #12

cppasm пишет:
Это как бы значит что операнд неправильный, а не команда не поддерживается.Читайте мануалы:lea si, [str1]

извини, не знал =)



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 февраля 2011 15:17
· Личное сообщение · #13

всем спасибо за помошь =)


 eXeL@B —› Программирование —› помогите найти ошибку в asm коде
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати