diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 7b9046fa929e3ef6d812bab884e278b91312c352..683117239c2e8761351cda82e0fc48635ce58682 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -378,9 +378,16 @@ int BreakHandler::findBreakpoint(const BreakpointData &needle) const
 
 int BreakHandler::findBreakpoint(const QString &fileName, int lineNumber) const
 {
-    for (int index = 0; index != size(); ++index)
-        if (at(index)->isLocatedAt(fileName, lineNumber))
-            return index;
+    if (lineNumber <= 0) {
+        QByteArray address = fileName.toLatin1();
+        for (int index = 0; index != size(); ++index)
+            if (at(index)->bpAddress == address)
+                return index;
+    } else {
+        for (int index = 0; index != size(); ++index)
+            if (at(index)->isLocatedAt(fileName, lineNumber))
+                return index;
+    }
     return -1;
 }
 
@@ -710,11 +717,22 @@ void BreakHandler::setBreakpoint(const QString &fileName, int lineNumber)
     QFileInfo fi(fileName);
 
     BreakpointData *data = new BreakpointData(this);
-    data->fileName = fileName;
-    data->lineNumber = QByteArray::number(lineNumber);
-    data->pending = true;
-    data->setMarkerFileName(fileName);
-    data->setMarkerLineNumber(lineNumber);
+    if (lineNumber > 0) {
+        data->fileName = fileName;
+        data->lineNumber = QByteArray::number(lineNumber);
+        data->pending = true;
+        data->setMarkerFileName(fileName);
+        data->setMarkerLineNumber(lineNumber);
+    } else {
+        data->funcName = fileName;
+        data->lineNumber = 0;
+        data->pending = true;
+        // FIXME: Figure out in which disassembler view the Marker sits.
+        // Might be better to let the user code create the BreakpointData
+        // structure and insert it here.
+        data->setMarkerFileName(QString());
+        data->setMarkerLineNumber(0);
+    }
     append(data);
     emit layoutChanged();
     saveBreakpoints();
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index c9d476657bb8b60fa7649494c6ebaf1dd98da018..de7b751e7013e6e532e5b0d3de83aac58b109b81 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -140,6 +140,7 @@ public:
     void removeAt(int index); // This also deletes the marker.
     void clear(); // This also deletes all the marker.
     int indexOf(BreakpointData *data) { return m_bp.indexOf(data); }
+    // If lineNumber < 0, interpret fileName as address.
     int findBreakpoint(const QString &fileName, int lineNumber) const;
     int findBreakpoint(const BreakpointData &data) const; // Returns index.
     BreakpointData *findBreakpoint(int bpNumber) const;
diff --git a/src/plugins/debugger/debuggeragents.cpp b/src/plugins/debugger/debuggeragents.cpp
index b18ce8916d65501f749a3cec4d0a47b80fdf3b0f..2258c66083f02703e46faf041d23495a1db85f5e 100644
--- a/src/plugins/debugger/debuggeragents.cpp
+++ b/src/plugins/debugger/debuggeragents.cpp
@@ -287,6 +287,7 @@ void DisassemblerViewAgent::setContents(const QString &contents)
                 Core::Constants::K_DEFAULT_TEXT_EDITOR_ID,
                 &titlePattern));
         d->editor->setProperty("OpenedByDebugger", true);
+        d->editor->setProperty("DisassemblerView", true);
         QTC_ASSERT(d->editor, return);
         if ((plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget())))
             (void) new DisassemblerHighlighter(plainTextEdit);
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index aa7f479ddcb4e986d065f72741577737ef451b85..2eb7529fd500b011e612c4a3218b0c9fb22b9068 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1128,8 +1128,19 @@ void DebuggerPlugin::requestContextMenu(TextEditor::ITextEditor *editor,
 {
     if (!isDebuggable(editor))
         return;
-    QString fileName = editor->file()->fileName();
-    QString position = fileName + QString(":%1").arg(lineNumber);
+
+    QString fileName, position;
+    if (editor->property("DisassemblerView").toBool()) {
+        QString fileName = editor->file()->fileName();
+        QString line = editor->contents()
+            .section('\n', lineNumber - 1, lineNumber - 1);
+        fileName = line.left(line.indexOf(QLatin1Char(' ')));
+        lineNumber = -1;
+        position = _("*") + fileName;
+    } else {
+        fileName = editor->file()->fileName();
+        position = fileName + QString(":%1").arg(lineNumber);
+    }
     BreakpointData *data = m_manager->findBreakpoint(fileName, lineNumber);
 
     if (data) {
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index ae66cde085381ef376fcc8af5cbf7aee37f8ae75..5a8d8679215b397493b5c61fb9c80d99489f5195 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2150,6 +2150,9 @@ QByteArray GdbEngine::breakpointLocation(int index)
     const BreakpointData *data = manager()->breakHandler()->at(index);
     if (!data->funcName.isEmpty())
         return data->funcName.toLatin1();
+    // In this case, data->funcName is something like '*0xdeadbeef'
+    if (data->lineNumber.toInt() == 0)
+        return data->funcName.toLatin1();
     QString loc = data->useFullPath ? data->fileName : breakLocation(data->fileName);
     // The argument is simply a C-quoted version of the argument to the
     // non-MI "break" command, including the "original" quoting it wants.