Язык ассемблера - PullRequest
       19

Язык ассемблера

0 голосов
/ 01 ноября 2011

Этот раздел меня сильно смущает. У меня есть примерная проблема, которая, я надеюсь, кто-то может разбить на шаги для меня, чтобы я мог понять, как это делается для решения других проблем.

mc:   call subr
mr:   mov  [val],ax
subr: push ax
      push bx
      push cx
      add  ax,dx
      pop  ax
      pop bx
      pop cx
      ret

Книга спрашивает, для чего будет использоваться шестнадцатеричное значение в регистре sp и ax, когда код вернется из подпрограммы и достигнет инструкции mr: mov [val],ax. sp=0100 ax=0002, но я понятия не имею, как получить эти ответы.

Инструкция mc: call subr сохраняет адрес следующей последовательной инструкции mr: mov [val],ax в стеке, чтобы подпрограмма могла правильно вернуться. Абсолютный адрес в памяти, где сохраняется адрес возврата, равен 1120E. Может ли кто-нибудь рассказать об этом?

registers given:
ax = 0000  bx = 0001  cx = 0002  dx = 0004
si = 0000  di = FFFF  bp = 0080  sp = 0100
cs = 1000  ds = 1100  es = 1110  ss = 1111

1 Ответ

1 голос
/ 01 ноября 2011

Вызов на mc: сохранит текущий адрес, поэтому, когда вернется subr:, управление снова начнется с mr:.

, так как subr: толкает топор, бх и скс вэтот порядок.Затем он добавляет топор, bx и cx в этом порядке, поэтому то, что было вытолкнуто из cx, попадает в топор (и наоборот).В результате они меняются топором и cx.add ax, dx не оказывает реального влияния на полученный результат, потому что сразу после добавления dx к топору он выталкивает топор из стека.add действительно влияет на флаги, но здесь ничто не делает ничего, основанного на флагах, поэтому, по крайней мере, в показанном вами коде это тоже мало что значит.

После того, как управление вернется к mr:, он записывает значение в ax в память, а затем возвращается обратно в subr:, таким образом меняя топор и cx обратно туда, откуда они начались.

IOW, в целом это очень медленное, обходное движениеспособ достижения примерно того же эффекта, что и:

mc: mov [val], cx
    ret

Что касается абсолютного адреса, сказать особо нечего.В частности, весьма вероятно, что если вы снова запустите тот же код, он может быть загружен по другому адресу, или адрес, сохраненный в стеке, может быть совершенно другим.

...