可能重複:
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。
不要重複已關閉的任務。你的引導程序是不相關的。你的平臺無關緊要。您需要先學習基本的彙編程序(x86或其他)。如何將數據移入/移出寄存器/內存完全是任何平臺的核心基本功能,如果您需要在此處詢問有關內容,則不會在項目中取得更大的進展。 –
@ Marc爲什麼我的bootloader不相關,爲什麼我的平臺不相關?我知道基本的大會。我知道如何使用mov,命令,但出於某種原因,有一種與變量不同的方式,我想弄明白。我已閱讀過書籍,還有納斯姆的教程,並沒有發現任何我想做的事情。 – civilwarrock
@civilwarrock如果你有變量的問題,我很抱歉,但你*不知道基本的程序集呢。 – duskwuff