每当我尝试使用NASM编译我的代码时,有一个"pop"(在这种情况下为"pop al"),它会给我一个错误.
20: error: invalid combination of opcode and operands
Run Code Online (Sandbox Code Playgroud)
在第20行,我有
pop al
Run Code Online (Sandbox Code Playgroud)
有什么问题?
我看到如下代码:
section .data
db 'hello'
db 'h', 'e', 'l','l','o'
data_segment_size equ $-$$
Run Code Online (Sandbox Code Playgroud)
为什么data_segment_size等于25?我知道$和$$表示什么,但是根据我的书我不明白为什么这个变量是25。也许那本书里有一个错误。
因此,我目前正在使用操作系统,并且处于非常愚蠢的状态:切换到VESA / VBE
我当前的代码:
mov ax, 0x4F02
mov bx, 0x4118
int 0x10
Run Code Online (Sandbox Code Playgroud)
它改变了Qemu分辨率,但是现在我在绘制像素时遇到了问题。像素偏移的公式为:
uint32 pixel_offset = y * pitch + (x * (bpp/8)) + framebuffer;
Run Code Online (Sandbox Code Playgroud)
问题是bpp,pitch和framebuffer应该由
mov ax, 0x4F01
int 0x10
Run Code Online (Sandbox Code Playgroud)
和
mov ax, 0x4F00
int 0x10
Run Code Online (Sandbox Code Playgroud)
第一,
mov ax, 0x4F00
int 0x10
Run Code Online (Sandbox Code Playgroud)
软锁qemu。即使没有,我该怎么做才能访问该信息。
我想要的是一个功能,该功能可以切换为完全用汇编语言(nasm)编写的VESA / VBE,然后可以使用我的内核编写的函数访问。
编辑:我真的不能在我的引导程序中包含任何C。我需要汇编代码。
考虑以下用 x86 汇编语言编写的函数
foo:
rep
nop
ret
Run Code Online (Sandbox Code Playgroud)
使用 NASM 汇编代码并反汇编它,gdb我们有:
(gdb) disas foo
Dump of assembler code for function foo:
0x0000000000000610 <+0>: pause ;pause ????
0x0000000000000612 <+2>: ret
0x0000000000000613 <+3>: nop WORD PTR cs:[rax+rax*1+0x0]
0x000000000000061d <+13>: nop DWORD PTR [rax]
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)
它使用pause原始程序集中未提供的指令。为什么会这样?这是 NASM 故意记录的行为吗?那么如果一些早期的 x86cpu没有pause我们可以直接使用rep nop吗?
所以我最近试图进入组装,并发现自己真的与NASM的工作方式混淆.据我所知,它是一种用于汇编的"编译器",它将(记忆)指令转换为实际的机器代码.现在我想知道NASM手册(www.nasm.us/doc/nasmdocb.html)中列出的说明和我的机器所采用的操作码之间有什么区别?比如,让我们假装我的英特尔处理器有某种秘密操作码,没有人知道并且没有在手册中列出,NASM是否仍然可以组装它?或者只是返回'无效指令'?并说我知道操作码的机器码格式,我能够手动插入吗?
我是 linux 新手,我对构建和其他东西了解不多。我尝试安装 sasm:下载它,解压缩它,尝试了所有不同的安装方法,但没有一个工作。
http://sureshat.blogspot.com/2016/10/installing-sasm-assembly-ide-in-ubuntu.html
...是我找到的唯一正确指南,但是,可能导致安装 SASM 的给定链接已失效,它不想工作。有没有人可以帮我解决这个问题?
谢谢,马丁
section .data
msg db "sum of x and y is " ;String
section .text
global _start
_start:
Change_letter:
mov ECX, -1 ;set counter
mov ESI, [msg] ; move string address to ESI
mov Eax , 32 ; mov 32 to eax for change lowercase to uppercase
startloop:
inc ecx ;
cmp byte [ESI+ecx], 0x00 ;compare with null
jne end
cmp byte [ESI+ECX], 0x61 ; compare with lower bound of lowercase
jl startloop
cmp byte [ESI+ECX], 0x7A
jg startloop
add byte …Run Code Online (Sandbox Code Playgroud)