有没有办法在Linux中执行平面二进制映像,使用如下语法:
nasm -f bin -o foo.bin foo.asm
runbinary foo.bin
Run Code Online (Sandbox Code Playgroud) 我有一个简单的NASM程序,它只调用sys_exit:
segment .text
global _start
_start:
mov eax, 1 ; 1 is the system identifier for sys_exit
mov ebx, 0 ; exit code
int 0x80 ; interrupt to invoke the system call
Run Code Online (Sandbox Code Playgroud)
当我第一次写它时,我犯了一个错误,忘记了int和之间的空间0x80:
int0x80
Run Code Online (Sandbox Code Playgroud)
...但程序仍然编译没有问题!
[prompt]> nasm -f elf MyProgram.asm
[prompt]> ld -o MyProgram MyProgram.o
Run Code Online (Sandbox Code Playgroud)
当我运行它时它只给了我一个分段错误!
[prompt]> ./MyProgram
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
那么这个程序 - 我写的原始程序,缺少的空间 - 是做什么的呢?int0x80在NASM 中(没有空格)是什么意思?
segment .text
global _start
_start:
mov eax, 1
mov ebx, 0
int0x80 ; no space...
Run Code Online (Sandbox Code Playgroud) 首先,这是家庭作业.
我正在尝试将5位数字读入寄存器bx.假设该数字不大于65535(16位).以下是我试图这样做的方式.
但是,当我尝试打印数字时,我只打印输入的最后一个数字.这让我想到,当我向bx添加另一个号码时,它会覆盖以前的号码,但我无法看到问题.任何帮助将不胜感激,我几乎可以肯定它是一个小我忽略的东西: - /
mov cx,0x05 ; loop 5 times
mov bx,0 ; clear the register we are going to store our result in
mov dx,10 ; set our divisor to 10
read:
mov ah,0x01 ; read a character function
int 0x21 ; store the character in al
sub al,0x30 ; convert ascii number to its decimal equivalent
and ax,0x000F ; set higher bits of ax to 0, so we are left with the decimal
push ax ; store …Run Code Online (Sandbox Code Playgroud) 我需要一些参考但是一个很好的参考,可能有一些很好的例子.我需要它因为我开始使用NASM汇编程序在汇编中编写代码.我有这个参考:
http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html
这是非常好的和有用的,但它有很多限制,因为它不解释其他寄存器中的字段.例如,如果我使用写入系统调用,我知道我应该在EAX寄存器中放置1,并且ECX可能是指向字符串的指针,但是EBX和EDX呢?我想要解释一下,EBX确定输入(stdin为0,其他为1等),EDX是要输入的字符串的长度等等.我希望你理解我想要的东西,我找不到任何这样的材料,所以这就是我在这里写的原因.提前致谢.
我有一个文件定义了非常基本的IO函数,我想创建另一个使用该文件的文件.
有没有办法将这两个文件联系起来?
prints.asm:
os_return:
;some code to return to os
print_AnInt:
;some code to output an int, including negatives - gets param from stack
print_AChar:
;some code to output a char - gets param from stack
Run Code Online (Sandbox Code Playgroud)
usingPrintTest.asm:
main:
push qword 'a'
call print_AChar ;gets this from prints.asm somehow (that's my question)
call os_return ;and this too..
Run Code Online (Sandbox Code Playgroud)
注意这些不是实际的文件......它们只是用于解释我的问题:)
谢谢!
我正在学习x86程序集,我正在尝试在NASM中制作玩具操作系统,但我不了解一些事情.
我做了一个成功启动内核的bootloader:
kernel.feo;0x2000;jmp 0x2000:0x0000.所以我的内核代码位于0x2000:0内存中.CS可能是因为使用远跳而设置得当.在这个内核代码中,我想进入32位保护模式,但我不确定GDT是如何工作的.当我在虚拟机上运行下面的代码时(QEMU),它不会做任何事情.
我想请你帮我进入32位保护模式!
也就是说,您有以下问题:
- 您认为代码是
0x7c00:0由于加载而导致的org 0,但可能并非如此.唯一保证的是物理地址.您应该使用远程跳转到您的入口点,以便CS正确设置.- 您出于某种原因进行设置
DS,0x2000以便您的代码根本找不到任何数据.您应该设置DS匹配CS,或在CS任何地方使用覆盖(不推荐).- 受保护的模式代码假设从零开始的段,这反过来意味着它预计
org 0x7c00当然与您的设置冲突.你应该切换到org 0x7c00和细分0.- VGA文本模式段
0xb8000不是0xb80000(少一个零).- 您没有
0x55 0xaa在引导扇区末尾的引导签名字节.
我在代码中更正了这些内容:
[org 0x0]被更正为[org 0x2000]并且段被设置为0;DS被纠正为0而不是0x2000,所以现在它匹配CS;0xb8000;但代码不适用于这些更正,它应该打印两个字符串,但它什么都不做! …
我写了一个简单的汇编程序:
section .data
str_out db "%d ",10,0
section .text
extern printf
extern exit
global main
main:
MOV EDX, ESP
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
CALL exit
Run Code Online (Sandbox Code Playgroud)
我是NASM汇编程序和GCC,用于将目标文件链接到linux上的可执行文件.
本质上,该程序首先将堆栈指针的值放入寄存器EDX,然后将该寄存器的内容打印两次.但是,在第二次printf调用之后,打印到stdout的值与第一个不匹配.
这种行为似乎很奇怪.当我用EBX替换该程序中每次使用EDX时,输出的整数与预期的完全相同.我只能推断在printf函数调用期间某些时候EDX会被覆盖.
为什么会这样?如何确保我将来使用的寄存器与C lib函数不冲突?
我正在学习本教程:https://littleosbook.github.io/#linking-the-kernel
而且我在Mac上.我正处于创建目标文件的位置nasm,我希望将其转换为ELF可执行文件ld.将ld在Mac上看起来并不像它支持ELF格式,但我并不想运行一个虚拟机使用Ubuntu只是做此链接步骤.
是否有可能ld在Mac 上安装GNU 并与Mac一起运行ld?
开始自学组装(NASM)我想知道如何划分2个数字(例如在Windows上).
我的代码看起来像这样,但它崩溃了.
global _main
extern _printf
section .text
_main:
mov eax, 250
mov ebx, 25
div ebx
push ebx
push message
call _printf
add esp , 8
ret
message db "Value is = %d", 10 , 0
Run Code Online (Sandbox Code Playgroud)
我想知道什么是真的错了?它甚至不显示除法后的值.
我读了关于Meltdown和Spectre的所有周末
我也已经阅读了针对Spectre和Meltdown的.pdfs,对于 那些寻求更多关于这些漏洞的知识的人来说,这是必读的,但遗憾的是没有提供有关代码的详细解释.
我在github上发现了各种PoC,这非常有趣,但我缺乏完全理解它的知识.关于特定部分的更多解释,我将感激不尽:
从这个链接https://github.com/dendisuhubdy/meltdown/blob/master/src/poc.c ,以及其他git存储库,这个漏洞的概念中有许多有趣的部分.
时间读
/* Time reads. Order is lightly mixed up to prevent stride prediction */
for (i = 0; i < 256; i++) {
mix_i = ((i * 167) + 13) & 255;
addr = &array2[mix_i * 512];
time1 = __rdtscp(&junk); /* READ TIMER */
junk = *addr; /* MEMORY ACCESS TO TIME */
time2 = __rdtscp(&junk) - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
if …Run Code Online (Sandbox Code Playgroud)