2012-10-02 15 views
-3

可能重複:
x86 Assembly move on byte from on memory location to anotherx86彙編真正得到一個變量值Vs利用其存儲位置

好了,basicly我已經花了三天時間在這個問題上。這就是我想的情況,如果可能的話,我想弄清楚。好的,所以我幾乎正在使用Nasm編寫一個操作系統,它運行在保護模式下,是32位。現在我試圖創建一個簡單的一個字節變量,值爲104,這是一個'h'。現在我想將這個變量的值移到一個寄存器中,我猜'ax'會很好,然後將104移動到內存位置'0xB8000'。這是我的代碼,應該這樣做,並不是所以我需要一些幫助。謝謝 - 馬特

 
%ifndef ELF_COMPILATION 
use32 
org 0x200000 
[map all main.map] 
%endif 
section .data 
%ifndef ELF_COMPILATION 
MultibootSignature dd 464367618 
MultibootFlags dd 65539 
MultibootChecksum dd -464433157 
MultibootHeaderAddr dd MultibootSignature 
MultibootLoadAddr dd MultibootSignature 
MultibootLoadEndAddr dd EndCode 
MultibootBSSEndAddr dd EndCode 
MultibootEntryAddr dd START 
%endif 
%ifdef ELF_COMPILATION 
MultibootSignature dd 464367618 
MultibootFlags dd 3 
MultibootChecksum dd -464367621 
%endif 
MultibootGraphicsRuntime_VbeModeInfoAddr dd 2147483647 
MultibootGraphicsRuntime_VbeControlInfoAddr dd 2147483647 
MultibootGraphicsRuntime_VbeMode dd 2147483647 
MultiBootInfo_Memory_High dd 0 
MultiBootInfo_Memory_Low dd 0 
Var2: db 104 
section .text 
jmp START 
START: 
    ;Print out letter out. 
    call DisplayMessage 
    jmp Halt 
DisplayMessage: 
    mov ax, Var2 
    mov [0xB8000], ax 
    ret 
Halt: 
    jmp Halt 
EndCode: 

無論如何,我問了一個類似這樣的問題,並沒有運氣。我大部分都知道大會,但我不明白爲什麼這不起作用。我所能想到的是它的推杆Var2的內存地址與ax中的實際值。如果是這種情況,我該如何將該地址的104加載到ax,然後加載到0xB8000中?多謝你們。

差不多忘了,我使用的bootloader是SysLinux。

+0

不要重複已關閉的任務。你的引導程序是不相關的。你的平臺無關緊要。您需要先學習基本的彙編程序(x86或其他)。如何將數據移入/移出寄存器/內存完全是任何平臺的核心基本功能,如果您需要在此處詢問有關內容,則不會在項目中取得更大的進展。 –

+0

@ Marc爲什麼我的bootloader不相關,爲什麼我的平臺不相關?我知道基本的大會。我知道如何使用mov,命令​​,但出於某種原因,有一種與變量不同的方式,我想弄明白。我已閱讀過書籍,還有納斯姆的教程,並沒有發現任何我想做的事情。 – civilwarrock

+0

@civilwarrock如果你有變量的問題,我很抱歉,但你*不知道基本的程序集呢。 – duskwuff

回答

0

像這樣的東西應該工作:

mov ah, Var2 
mov edi, 0xb8000 
mov [edi], ah 

...與寄存器[edi]而不是內存地址直接引用的內存,並使用1個字節的寄存器數據。

+0

這使得屏幕打印出一個4?我想知道爲什麼?再說一遍,我能想到的就是使用指針,而不是實際上在那個地址的內容。基本上,當我使用Var2執行移動命令時,它使用它的指針而不是值,這在某些情況下是有用的,但我希望它的值。你是怎樣做的?謝謝 – civilwarrock

+0

等一下,我做了以下事情,只是出於好奇心,回想起用[和a]包圍某個東西通常意味着一個內存地址,並且果然它工作正常!新代碼: mov ah,[Var2] mov edi,0xB8000 mov [edi],ah 非常感謝你給我這個例子! – civilwarrock