小编nrz*_*nrz的帖子

使用NASM的字符串长度

我试图在NASM中编写代码以获取给定字符串的长度.但是给出了一些垃圾值作为长度.代码如下:

    section .data
        a db "nitin",10,0
        msg db "length = %d",10,0
    section .text
        global main
        extern printf
    main:
         nop
         xor eax,eax
         mov eax, a
         xor edx,edx
    length:
         mov dl, byte[eax]
         cmp dl,0
         je print
         inc eax
         jmp length

    print:
         pusha
         push eax
         push msg
         call printf
         add esp,8
         popa
    done:
         nop
Run Code Online (Sandbox Code Playgroud)

结果如下所示:长度= 132445678

你能帮我解决一下我的错误吗?

谢谢

x86 assembly nasm

0
推荐指数
1
解决办法
6393
查看次数

使用div指令在x86 NASM程序集中浮点异常

我有一个任务,我必须输入一个数字,并找出所有素数,但不超过该数字.例如,如果我在程序中输入9,它应该打印3,5和7.

我确定数字是否为素数的计划是将其除以2并检查余数是否为0.如果余数为0,则程序从被除数中减去1,然后循环回到顶部再次除以.如果余数!= 0则将其打印到屏幕上,并再次递减红利.这种情况一直发生,直到被除数为0.只有这不是正在发生的事情,无论出于什么原因,每当我使用DIV指令时,我总是得到浮点异常,我似乎无法弄清楚为什么或如何解决它.任何人对我如何解决这个问题都有任何想法?

    Code: %INCLUDE      "csci224.inc"

    SEGMENT .data
    prompt:     DD      "Please enter a number: ",0     ; prompt string 
    message:    DD      " is prime.", 0                 ; displays when n is prime
    invalid:    DD      "Invalid entry.", 0
    i:          DD      2                               

    SEGMENT .bss
    input:      RESD    100         ; not really necessary, ignore this

    SEGMENT .text
    main:

    mov     edx, prompt
    call    WriteString

    call    ReadInt

    mov     esi, eax                ; move eax into esi to use as index for loop

    myloop:

    xor     edx, edx                ; …

x86 assembly nasm floating-point-exceptions

0
推荐指数
1
解决办法
2411
查看次数

这个语句在汇编中意味着什么?

ptr当处理翻译以下代码段时,有人可以告诉我在那里的目的吗?

cmp byte ptr [eax], 0
Run Code Online (Sandbox Code Playgroud)

ptr 是一个标签,它的值是:

(++>
Run Code Online (Sandbox Code Playgroud)

我的理解cmp是,它将左侧的值与右侧的值进行比较。

涉及到第三个参数(ptr),这是什么意思?是与ptr中的内存地址值进行 AND比较吗?eax0

如果有人可以帮我把它翻译成英文,那就太好了。谢谢。

x86 assembly cmp

0
推荐指数
1
解决办法
3375
查看次数

编译器会将跳转表放在函数的末尾吗?

例如,这是一个带跳转表的程序集

movl    $5, -4(%ebp)
cmpl    $10, -4(%ebp)
ja  L13
movl    -4(%ebp), %eax
sall    $2, %eax
movl    L14(%eax), %eax
jmp *%eax
.section .rdata,"dr"
.align 4
L14:
.long   L13
.long   L3
.long   L4
.long   L5
.long   L6
.long   L7
.long   L8
.long   L9
.long   L10
.long   L11
.long   L12
.text
L3:
movl    $LC0, (%esp)
call    _printf
jmp L2
...
Run Code Online (Sandbox Code Playgroud)

我的问题是,像GCC或ICC这样的编译器是否可以将跳转表放在函数的末尾而不是函数的中间?

c compiler-construction x86 assembly

0
推荐指数
1
解决办法
234
查看次数

x86与lea指令混淆

所以lea指令 - 加载有效地址 - 假设用于加载地址,但我有点混淆这个例子,

lea (%edx, %ecx, 1), %eax
Run Code Online (Sandbox Code Playgroud)

该指令用于获取地址的字节值(基址%edx和偏移量%ecx)吗?如果是这样,在这种情况下是否可以使用mov指令而不是使用lea

x86 assembly

0
推荐指数
1
解决办法
521
查看次数

从大小大于指令中可用大小的内存加载

现在的处理器大多是 32 位或 64 位。这意味着它们处理的指令具有这个大小。

我们经常听说 32 位操作系统的 RAM 限制为 4GB=(2^32 位),因为 RAM 地址的长度需要保存在 32 位内。

但事实上,当我们查看指令的外观时,您通常需要不到 32 位来加载一个字。

以 x86mov指令为例,您有一个操作码、一个源地址和一个目标地址。

我的问题是,我们如何才能从 32 位长的地址加载某些内容?

我们是否总是需要在内存中某个位置有一个指向该地址的指针,该位置具有可在指令中使用的较小地址?

谢谢

memory 64-bit assembly 32-bit instructions

0
推荐指数
1
解决办法
555
查看次数

每个指令的周期 - 汇编中的一行代码是否与cpi操作不同?

想象一下,你有两个装配说明:

movl $10, %ecx
movl 0(%eax), %edx
Run Code Online (Sandbox Code Playgroud)

移动的CPI为1,内存的CPI为2.

对于第一行CPI = 1.对于第二行,CPI = 2还是3?我们总结进入内存(2个周期)+移动成本,还是只考虑对内存的访问?

performance x86 assembly

0
推荐指数
1
解决办法
508
查看次数

奇怪的SIMD指令行为

SSE2指令(paddd xmm,m128)的工作真的很奇怪.代码告诉所有人.

#include <iostream>
using namespace std;

int main()
{
     int * v0 = new int [80];
     for (int i=0; i<80; ++i)
          v0[i] = i;
     int * v1 = new int [80];
     for (int i=0; i<80; ++i)
          v1[i] = i;

     asm(
     ".intel_syntax noprefix;"
     "mov rcx , 20;"
     "mov rax , %0;"
     "mov rbx , %1;"

     "m_start:;"
     "cmp rcx , 0;"
     "je m_end;"

     "movdqu xmm0 , [rax];"
     "paddd xmm0 , [rbx];"
     "movdqu [rax] , xmm0;"

     "add rbx , 16;" …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc x86-64 sse2

-1
推荐指数
1
解决办法
68
查看次数