标签: nasm

将十进制转换为十六进制

首先,这是家庭作业.

我正在尝试将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)

assembly nasm multiplication

6
推荐指数
1
解决办法
5523
查看次数

系统调用的良好参考

我需要一些参考但是一个很好的参考,可能有一些很好的例子.我需要它因为我开始使用NASM汇编程序在汇编中编写代码.我有这个参考:

http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html

这是非常好的和有用的,但它有很多限制,因为它不解释其他寄存器中的字段.例如,如果我使用写入系统调用,我知道我应该在EAX寄存器中放置1,并且ECX可能是指向字符串的指针,但是EBX和EDX呢?我想要解释一下,EBX确定输入(stdin为0,其他为1等),EDX是要输入的字符串的长度等等.我希望你理解我想要的东西,我找不到任何这样的材料,所以这就是我在这里写的原因.提前致谢.

linux assembly reference nasm

6
推荐指数
2
解决办法
3029
查看次数

如何链接两个nasm源文件

我有一个文件定义了非常基本的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)

注意这些不是实际的文件......它们只是用于解释我的问题:)

谢谢!

compiler-construction assembly linker nasm extern

6
推荐指数
1
解决办法
4124
查看次数

为什么在调用printf时会覆盖EDX的值?

我写了一个简单的汇编程序:

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函数不冲突?

c assembly nasm inline-assembly

6
推荐指数
2
解决办法
754
查看次数

切换到更高的分辨率

最近,我开始在NASM和C中开发一个操作系统.我已经制作了一个启动加载程序,内核,文件系统等.到目前为止,我直接使用VGA文本模式来写入地址0x000B8000.所以,我决定切换到视频模式而不是文本模式.我选择了最大显示分辨率320x200,但后来我意识到有三个问题.首先,只有256种不同的颜色.其次,分辨率太小.第三,写入地址0x000A0000太慢了.我尝试做一些动画,但它非常迟钝,有时它会在下一帧之前等待超过一秒钟.

我在互联网上搜索了一些关于如何切换到更高分辨率的解释,例如1920x1080如何使用256*256*256颜色而不仅仅是256.我发现的一切都说很难使用更高的分辨率,因为你必须开发所有不同的驱动程序显卡类型和某些卡没有文档,所以我们必须使用逆向工程.

我真的想在我的操作系统中引入高分辨率图形.真的很难还是有简单的方法?关于如何解决这个问题的任何建议?

c nasm osdev

6
推荐指数
1
解决办法
388
查看次数

如何在Mac OS X上创建ELF可执行文件?

我正在学习本教程:https://littleosbook.github.io/#linking-the-kernel

而且我在Mac上.我正处于创建目标文件的位置nasm,我希望将其转换为ELF可执行文件ld.将ld在Mac上看起来并不像它支持ELF格式,但我并不想运行一个虚拟机使用Ubuntu只是做此链接步骤.

是否有可能ld在Mac 上安装GNU 并与Mac一起运行ld

macos nasm elf ld

6
推荐指数
1
解决办法
3433
查看次数

所有asm标签都成为可执行文件中的符号

使用时组装对象时nasm,我发现所有标签都包含在结果.o文件中的符号中,以及最终的二进制文件中.

这对于我已经声明的函数入口点GLOBAL和段开始部分(例如,对于该.text部分)是有意义的,但是标签简单地用作循环入口点并且所有这些都接近出现在输出文件中似乎很奇怪.除了泄漏内部实现细节之外,它还浪费了符号表中的空间.

例如,鉴于这个简短的装配程序:

GLOBAL _start
_start:
    xor eax, eax
normal_label:
    xor eax, eax
.local_label:
    xor eax, eax
    xor edi, edi
    mov eax, 231    ;  exit(0)
    syscall
Run Code Online (Sandbox Code Playgroud)

...建造使用:

nasm -f elf64 label-test.s
ld label-test.o -o label-test
Run Code Online (Sandbox Code Playgroud)

l对象文件和链接的可执行文件中生成(即本地)符号:

objdump --syms label-test.o

label-test.o:     file format elf64-x86-64

SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 label-test.s
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000002 l       .text  0000000000000000 normal_label
0000000000000004 l       .text  0000000000000000 normal_label.local_label
0000000000000000 g       .text …
Run Code Online (Sandbox Code Playgroud)

x86 assembly linker nasm elf

6
推荐指数
1
解决办法
551
查看次数

编写汇编函数时,序言和结尾是必需的吗?

最近,我重新编写了一些libc函数,对于其中的某些函数(不需要任何调用syscall指令,例如strlen),我丢弃了序言和结尾,因为没有它,我的测试就不会失败(也许是还不够复杂)。在同行评审中,有人告诉我,丢弃它们是一种不好的做法,但无法解释原因。

因此,当我调用没有序言/结尾组合的asm函数时,是否会遇到问题?

即使在堆栈上不需要额外空间的情况下,添加它也是一个好习惯吗?

如果出于某些原因是强制性的,为什么汇编器(我使用过nasm)不负责?

c assembly nasm

6
推荐指数
1
解决办法
233
查看次数

在NASM中划分两个数字

开始自学组装(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)

我想知道什么是真的错了?它甚至不显示除法后的值.

x86 assembly nasm integer-division

6
推荐指数
1
解决办法
6899
查看次数

Meltdown PoC详细代码审查

我读了关于Meltdown和Spectre的所有周末

我也已经阅读了针对SpectreMeltdown的.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)

c security assembly exploit nasm

6
推荐指数
0
解决办法
572
查看次数