@asault_ceko

Почему не работают цепные команды в ассемблере?

Добрый день! Почему у меня не хотят работать корректно цепные команды?
Я записываю адрес на node 1 в si, потом меняю флажок df на 0, чтобы движение шло вперед по байту, через lodsb загружаю байт в al из si и хочу записать его в namex в структуре, но оно не записывается. Сама запись реализована правильно, я пробовал записывать в namex номер итерации цикла от 0 до 1 и все нормально записалось. Но с цепными проблема...
Code2 SEGMENT use16
ASSUME cs:Code2, ds:Data1, es:Data2
    mov      ax,Data1        
    mov      ds,ax     ; запис адреси data1 в ds
    mov      ax,Data2        
    mov      es,ax     ; запис адреси data2 в ds
	
    mov I_struc, 0 ;обнуляємо індекс структури
    lea si, node1  ;  <---
    cld            ;  <---
    @cycle_struc2:
        cmp I_struc, 6 ;перевірка ітерації циклу
        jae @finish_cycle_struc2 ;якщо >= 6 то закінчити цикл
        movzx bp, I_struc ;записуєм індекс структури
        imul bp, size Node ;множимо на розмір структури
        mov I_namex, 0 ;обнуляємо індекс поля адреси
		
        @cycle_namex:
            cmp I_namex, 5 ;перевірка ітерації вкладеного циклу
            jae @finish_cycle_namex ;якщо >= 5 то закінчити цикл
			
            lea bx, A1[bp] ;записуєм адресу поточної структури
            movzx di, I_namex ;записуєм індекс поля
			
            lodsb  ;  <---
            mov BYTE PTR A1[bx].namex[di],al ;записуєм в імені ім'я структури
			
            inc I_namex ;+1 до ітерації
            jmp @cycle_namex
        @finish_cycle_namex:
        inc I_struc ;+1 до ітерації
        add si, 5
        jmp @cycle_struc2
    @finish_cycle_struc2:
Code2 ENDS


Вот логические сегменти
Node STRUC
namex db 5 dup(?)
field1 dw 5 dup(?)
Node ENDS

Data1 SEGMENT
I_struc db ?
I_namex db ?
A1 Node 6 dup(<>)
Data1 ENDS

Data2 SEGMENT
    node1 DB 'node1'
	node2 DB 'node2'
	node3 DB 'node3'
	node4 DB 'node4'
	node5 DB 'node5'
	node6 DB 'node6'
Data2 ENDS
  • Вопрос задан
  • 29 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему у меня не хотят работать корректно цепные команды?

Что конкретно не работает? В формате: "ожидаю X, происходит Y".

В коде два странных места. Первое:
mov      ax,Data2
mov      es,ax     ; запис адреси data2 в ds
...
lea si, node1  ;  <---

node1 находится в сегменте Data2, адрес которого загружен в es, но команда lodsb загружает данные из ds:si.

Второе:
@finish_cycle_namex:
inc I_struc ;+1 до ітерації
add si, 5

Зачем здесь добавлять 5 к si? si указывает на область памяти в которой лежит массив 5-символьных имён, внутренний цикл как раз перемещает si на следующее имя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы