我想在ASM内核中设置视频模式我正在处理视频模式1920x1080或更高(或至少高于VESA中的通常限制).反正有没有这样做,如果有,提供示例代码?
我正在使用NASM来编写内核代码.
我正在使用Ubuntu 12.10 64bit.
我正在尝试在GDB中调试一个简单的汇编程序.但是GDB的gui模式(-tui)似乎无法找到我的汇编文件的源代码.我在目前的目录中重建了该项目并搜索谷歌无济于事,请在这里帮助我.
我的命令:
nasm -f elf64 -g -F dwarf hello.asm
gcc -g hello.o -o hello
gdb -tui hello
Run Code Online (Sandbox Code Playgroud)
似乎加载了调试信息,我可以在main()处设置断点,但屏幕的上半部分仍然显示' [No Source Available] '.
如果你有兴趣,这是hello.asm:
; hello.asm a first program for nasm for Linux, Intel, gcc
;
; assemble: nasm -f elf -l hello.lst hello.asm
; link: gcc -o hello hello.o
; run: hello
; output is: Hello World
SECTION .data ; data section
msg: db "Hello World",10 ; the string to print, 10=cr
len: equ $-msg ; "$" …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译和链接我在Assembler上的第一个程序.我尝试编译以下代码:
; %include "stud_io.inc"
global _main
section .text
_main:
xor eax, eax
again:
; PRINT "Hello"
; PUTCHAR 10
inc eax
cmp eax, 5
jl again
Run Code Online (Sandbox Code Playgroud)
在用于编译和链接程序的控制台命令下面:
-bash-3.2$ nasm -f macho main.asm -o main.o && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o
Run Code Online (Sandbox Code Playgroud)
但结果是:
ld: warning: ignoring file main.o, file was built for i386 which is not the architecture being linked (x86_64): main.o
Undefined symbols for architecture x86_64:
"_main", referenced from:
-u command line option
ld: symbol(s) not found for …Run Code Online (Sandbox Code Playgroud) 我写了一个简单的NASM程序:
printtest.asm
section .data
str_out db "val = %d",10,0
section .text
global main
extern printf
main:
PUSH 5
PUSH DWORD str_out
CALL printf
ADD ESP, 8
MOV EAX, 1
INT 80h
Run Code Online (Sandbox Code Playgroud)
我使用以下命令链接并创建可执行文件:
nasm -f elf -l printtest.lst printtest.asm
gcc -o printtest printtest.o
Run Code Online (Sandbox Code Playgroud)
链接和执行时,这将打印"val = 5"没有问题.据我所知,printf默认情况下调用会写入stdout.那么为什么当我尝试将其传输到另一个程序时,其他程序似乎没有收到任何输入?
例如
./printtest | cat
Run Code Online (Sandbox Code Playgroud)
似乎什么都不做
我相信我从根本上误解了一些问题.
NASM返回如下错误:"在64位模式下不支持指令",我无法弄清楚要做什么.
主题说明pop ecx和push ecx说明.我可以使用什么代替它们,还是有其他方法来解决这个问题?
想象一下你10年前写的这篇文章(在英特尔MPX和bnd0.. bnd3注册表甚至在路线图上之前):
section .data
; define some globals which are part of an ABI so you can't just rename them
global bnd0 ; MPX bound register name conflict
bnd0: dd 123
global k0 ; AVX512 mask register name conflict
k0: dq 12345
Run Code Online (Sandbox Code Playgroud)
如何使用当前版本的NASM进行组装? 即NASM(或YASM)是否与支持新注册名称的新版本具有向前兼容性?
显然,在单个文件或项目中搜索/替换很容易解决.但理论上,您可以将全局变量名称作为库ABI的一部分,您可以从NASM导出或需要导入到NASM中extern ymm0.(必须声明外部符号,因此无法识别的寄存器名称永远不会汇编为符号引用.)
NASM语法已经不适合作为平台上C编译器输出的格式,这些平台不会为符号名称添加前缀_或执行其他类型的名称修改(例如Linux ELF).你无法编译全局int eax = 1;. 这就是AT&T语法%eax用于寄存器名称的原因.对该答案的评论中的讨论是启发这个问题的原因.请注意,GAS不需要声明外部符号; 无法识别的名称被视为符号(即使在.intel_syntax noprefix使用类似于MASM的语法的模式中).
相关:MASM如何处理新扩展的前向源兼容性?
你能以某种方式禁用MPX支持吗?
YASM支持一个CPU指令,允许您禁用对某些助记符的支持,但即使禁用AVX支持也不允许您将其ymm0用作符号名称.(YASM …
这个问题是受r / osdev中的Reddit问题启发的,除了这个问题集中在SS寄存器上。可能有人说过RTFM(代表ISA条目MOV),但是当出现此问题时,即使在OS开发人员中,它也会得到不同的答案。
问题:使用MOV指令将SS设置为0x0000是否会#GP(0)在64位模式下引起一般性保护故障?例如:如果我处于64位模式,并且当前特权级别(CPL)为0,我应该期望看到#GP(0)带有以下代码段的:
NULL_SEL_RPL0 EQU 0
mov eax, NULL_SEL_RPL0 ; EAX = 0x0000 = NULL Selector with
; Requested Privilege Level (RPL) 0.
mov ss, eax ; Try to set SS with NULL selector 0x0000
; Should this cause a #GP(0) fault?
Run Code Online (Sandbox Code Playgroud)
《 Intel x86指令集参考》所说的MOV是:
Run Code Online (Sandbox Code Playgroud)Operation DEST ? SRC; Loading a segment register while in protected mode results in special checks and …
我理解在x86_64汇编中有例如(64位)rax寄存器,但它也可以作为32位寄存器,eax,16位,ax和8位来访问.在什么情况下我不会只使用完整的64位,以及为什么会有什么优势?
举个例子,通过这个简单的hello world程序:
section .data
msg: db "Hello World!", 0x0a, 0x00
len: equ $-msg
section .text
global start
start:
mov rax, 0x2000004 ; System call write = 4
mov rdi, 1 ; Write to standard out = 1
mov rsi, msg ; The address of hello_world string
mov rdx, len ; The size to write
syscall ; Invoke the kernel
mov rax, 0x2000001 ; System call number for exit = 1
mov rdi, 0 ; Exit success = 0
syscall …Run Code Online (Sandbox Code Playgroud) 我创建了简单的代码来从硬盘驱动器加载第二个扇区,然后写入整个屏幕,空格为红色背景.问题是我总是用@符号代替空格.这是代码:
org 0x7C00
bits 16
xor ax,ax
mov ds,ax
mov es,ax
mov bx,0x8000
cli
mov ss,bx
mov sp,ax
sti
cld
clc
xor ah,ah
int 0x13
mov bx,0x07E0
mov es,bx
xor bx,bx
mov ah,0x2 ;function
mov al,0x5 ;sectors to read
mov ch,0x0 ;track
mov cl,0x2 ;sector
mov dh,0x0 ;head
int 0x13
;jc error
;mov ah, [0x7E00]
;cmp ah,0x0
;je error
jmp error
cli
hlt
jmp 0x07E0:0x0000
error:
xor bx,bx
mov ax,0xb800
mov es,ax
mov al,0x40 ;colour
mov ah,' ' ;character
.red: …Run Code Online (Sandbox Code Playgroud) "警告:签名的dword立即超出界限"是我现在存在的祸害,因为它似乎不一致或者我只是没有看到明显的事实.
我声明了以下结构:
struc FRTType
.class resq 1 ; Class
.type resq 1 ; Type
endstruc
Run Code Online (Sandbox Code Playgroud)
我有以下分配:
%assign TYPE_SCALAR 0xfffffffffffffff1
%assign INTEGER 0xffffffff1000a8a9
Run Code Online (Sandbox Code Playgroud)
在我的功能中:
cmp qword [rdi+FRTType.class], TYPE_SCALAR ; This works fine
jne .exception
cmp qword [rdi+FRTType.type], INTEGER ; THIS PRODUCES WARNING
Run Code Online (Sandbox Code Playgroud)
我知道我可以mov rax, INTEGER然后做比较,但这似乎不需要,因为第一次比较没有问题.