Модификация памяти в сборочном приложении - PullRequest
1 голос
/ 19 ноября 2008

Я изучаю язык ассемблера из книги "Искусство сборки x86", и у меня есть вопрос, на который я не смог придумать ответ.

программа выглядит так:

"в этом упражнении вы запустите запущенную программу, которая проверяет и оперирует значениями, найденными в памяти. Затем вы переключаетесь на экран памяти и изменяете значения в памяти (то есть вы получаете прямой доступ к памяти, пока программа продолжает работать).

программа начинается с установки ячейки памяти 1000h на ноль, затем она зацикливается до тех пор, пока не будет выполнено одно из двух условий - либо пользователь переключает переключатель FFF0, либо пользователь изменяет значение в ячейке памяти 1000h. Переключатель FFF0 завершает программу.

Изменение значения в ячейке памяти 1000h передает управление в раздел программы, который складывает n слов, где n - новое значение в ячейке памяти 1000h. "

После суммирования этих значений он печатает их сумму, используя «put»

У меня есть этот код:

d:  mov cx,0
    mov [1000],cx

a:  mov cx,[1000]
    cmp cx,0
    jne c

    mov ax,[fff0]
    cmp ax,0
    je a
    halt

c:  mov bx,1002
    mov ax,0

b:  add ax,[bx]
    add bx,2
    sub cx,1
    cmp cx,0
    jne b

    put
    jmp d

Проблема в том, что когда я ставлю значение 12h на 1000h, программа выводит 2 значения, сумму и число 1.

Когда я выполняю программу, она выводит 1 значение (сумму), но когда я запускаю ее, она выводит 2 значения (сумму и число 1).

Может кто-нибудь объяснить это поведение?

1 Ответ

0 голосов
/ 21 марта 2018

Я интерпретировал код, надеюсь, он кому-нибудь поможет:

Примечание. Этот код не учитывает многопоточность или прерывания при изменении регистров. Это простой нисходящий анализ (чтобы помочь новичку, а не «мужику»).

d:  mov cx,0 ; cx = 0
    mov [1000],cx ; Memory address 1000=0

a:  mov cx,[1000] ; Get from memory address 1000 to cx (cx=0)
    cmp cx,0 ; Is cx = 0?
    jne c ; If cx not 0 goto c

    mov ax,[fff0] ; ax = {whatever is at FFF0}
    cmp ax,0 ; Is ax=0?
    je a ; If ax = 0 goto a
    halt ; {STOP PROCESSOR} 

c:  mov bx,1002 ;  BX = 1002
    mov ax,0 ; AX = 0

b:  add ax,[bx] ; Add to ax WHATEVER is in MEMORY location bx
    add bx,2 ; Add 2 to bx
    sub cx,1 ; Deduct 1 from cx
    cmp cx,0 ; is cx = 0?
    jne b ; If cx is not 0 goto b

    put {what do you want to print?}  
    jmp d ; goto d (back to the top)
...