2016-03-21 9 views
0

アセンブリ言語に関する章で私の教科書を勉強していましたが、理解できない練習問題が発生しました(単項演算と二項演算のセクションは非常に小さいので、かなり失われた)。アセンブリ内での単項演算と二項演算

ここには、練習問題の2つの指示があります。私は、各命令のデスティネーションと価値を与えることになっています:

ADDQ%RCX、(%のRAX)

imulq $ 16(%のRAX、%のRDX、8)

%raxの値は0x100、%rdxの値は0x3、%rcxの値は0x1です。

誰もが両方の命令の解決方法を詳しく説明できますか?私は本の裏に答えがありますが、それに伴って実際の説明はありません。ありがとう。

+0

関連のないタグを追加しないでください! – Olaf

+0

申し訳ありませんが、私のクラスはCプログラミング言語を中心に扱われています(教科書もそうです)。 –

+0

しかしあなたの質問はありません。 – Olaf

答えて

3

あなたは命令は要するに

を行うかを把握するための命令セット・リファレンスを使用する方法)のアドレスが 2をどのように動作するか、有効) 1を知っておく必要があり、 disp(%base, %index, scale)%base + %index * scale + dispに対処するためのメモリ参照です。 1つを除くすべての部分はオプションです。 scaleは、 1, 2, 4または 8とすることができる。手動で addを見れば

さて、あなたはそれがアドレス0x100%raxの値)で、メモリ内のQWORDに1%rcxの値)を追加しますので、それはちょうど第二に、最初のオペランドを追加します見ることができます。

2番目の命令は無効です。このような形式のimulはありません。別のオペランドをコピーするのを忘れたのでしょうか?

著者は、第2オペランドに最初のものを掛けることを意味していたと思います。したがって、アドレス0x100 + 3 * 8 = 0x118のメモリ内のqwordには、16が乗算されます。

+0

私が混乱しているのは、1のためのものです:彼らは宛先が0x100で、値は0x100です。私はaddq&rcx、(%rax)が(%rax)+%rcx => 0x100 + 0x1 => 0x101に変わるだろうと考えました。 番号2の場合:宛先は0x118になり、値は0x110 –

+0

になります**「0x100」に「1」を追加しません**。アドレス0x100のqwordに '1 'を追加します。さて、彼らがそのアドレスのメモリ内容も '0x100'であると言った場合、実際には' 0x101'が結果になる可能性があります。 2番目の命令では、その命令が存在しないため、宛先と値について話すのは理にかなっていません。正しくコピーしたことを確認してください。 – Jester

+1

正しくコピーしたことを確認しました。それが私の元の投稿にどのように現れているかは、本にどのように書かれているかです。これは、私の教科書の[以前のバージョンのリンク](http://citeseerx.ist.psu.edu/viewdoc/download?doi)の以前のバージョンの127ページ(107ページのページ番号127ページ)の問題に似ています= 10.1.1.138.4401&rep = rep1&type = pdf) –

0

これはCSでの練習問題3.8からです:APP 3/E(グローバル版)

Address Value 
0x100  0XFF 
0x118  0x11 

Register Value 
%rax  0x100 
%rcx  0x1 
%rdx  0x3 

ADDQの%のRCX、(%のRAX)この質問のために

、あなたが取ります%rax(0XFF)のqwordを追加して%rcxを追加します。したがって、0XFF + 0x1 = 0x100です。アドレス(0x100)ではなく、メモリ(0XFF)に保持されている内容を指す(%rax)の角括弧に注意してください。

imulq $ 16 0x118である道化師によって示さ、右側(%のRAX +(%のRDX * 8))として

(8%RAX、%のRDX)。そのアドレスに格納されている値は0x11です。 imulqは0x11 * 0x10(16進数は0x10に変換されます)を乗算し、0x110と答えます。