кодирование сборки x86 с сегментом данных и циклом

Приведенный ниже код выводит «1» из сегмента данных someData. Затем он выводит числа от 1 до 5. Я хочу использовать «1» из сегмента данных, а не 1, установленный mov eax,1. Не уверен, как это сделать. Когда я использую символ «1», я думаю, что могу добавить к нему, чтобы получить следующее число, вместо того, чтобы делать и увеличивать все регистры.

INCLUDE Irvine32.inc
.data
someData BYTE "1",0dh,0ah,0
.code
main PROC
  call TEST 
 exit
main ENDP

TEST PROC
  mov  edx,OFFSET someData  ; this is just for testing
  call WriteString          ; just for testing

  mov  ecx,5
  mov  eax,1
L1: 
  call WriteDec  ; EAX is a counter
  call Crlf
  inc  al        ; next character
  Loop L1
  ret
TEST ENDP

END main

person Unity    schedule 17.03.2015    source источник
comment
Вы забыли опубликовать включенный файл Irvine32.inc. Я предполагаю, что процедуры WriteString, WriteDec и Crlf должны быть там. Я не могу запустить вашу программу без них.   -  person Jose Manuel Abarca Rodríguez    schedule 17.03.2015
comment
У меня есть это на другой машине, я выложу обратно. Так жаль.   -  person Unity    schedule 17.03.2015
comment
Мне нужно использовать «1» из someData   -  person Unity    schedule 17.03.2015


Ответы (1)


Проверяя свой код, я вижу, что вы используете AL (inc al), а не EAX. Таким образом, вы можете передать некоторые данные непосредственно в AL. Или вы можете использовать EAX, предварительно очистив его. Я изменяю ваш код для этих изменений:

.stack 100h
.data
someData BYTE "1",0dh,0ah,0   
.code
main PROC
  call TEST 
  mov  ax,4c00h
  int  21h
main ENDP

TEST PROC
  mov  dx,OFFSET someData  ; this is just for testing
  mov  ah,9
  int  21h ;DISPLAY SOMEDATA.

  mov  ecx,5
  mov  eax,0       ;CLEARING EAX, NOW SOMEDATA
  mov  al,someData ;IS IN WHOLE EAX.  
L1: 
  call WriteDec  ; EAX is a counter
  call Crlf
  inc  al        ; next character
  Loop L1
  ret
TEST ENDP

END main

Поскольку некоторые данные имеют тип BYTE, вы должны использовать AL, а не EAX, но, если вы хотите использовать EAX, который имеет размер DWORD, просто сначала очистите его, чтобы во всех его байтах были нули, а значение AL превалировало. в ЕАКС.

Кстати, вы используете для счета символы ASCII, я имею в виду, что вы считаете не 1, 2, 3... а "1", "2", "3"... Это не проблема, если вы хотите чтобы остановиться на 9, но если вы хотите перейти на 10, 11..., вам нужно будет изменить некоторые данные с «1» на 1. В этом случае, чтобы отобразить некоторые данные на экране, вам нужно будет создать процедуру для конвертировать из числа в символ, возможно, это то, что делает WriteDec.

person Jose Manuel Abarca Rodríguez    schedule 17.03.2015