我试图在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
你能帮我解决一下我的错误吗?
谢谢
我有一个任务,我必须输入一个数字,并找出所有素数,但不超过该数字.例如,如果我在程序中输入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 ; … ptr当处理翻译以下代码段时,有人可以告诉我在那里的目的吗?
cmp byte ptr [eax], 0
Run Code Online (Sandbox Code Playgroud)
ptr 是一个标签,它的值是:
(++>
Run Code Online (Sandbox Code Playgroud)
我的理解cmp是,它将左侧的值与右侧的值进行比较。
涉及到第三个参数(ptr),这是什么意思?是与ptr中的内存地址值进行 AND比较吗?eax0
如果有人可以帮我把它翻译成英文,那就太好了。谢谢。
例如,这是一个带跳转表的程序集
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这样的编译器是否可以将跳转表放在函数的末尾而不是函数的中间?
所以lea指令 - 加载有效地址 - 假设用于加载地址,但我有点混淆这个例子,
lea (%edx, %ecx, 1), %eax
Run Code Online (Sandbox Code Playgroud)
该指令用于获取地址的字节值(基址%edx和偏移量%ecx)吗?如果是这样,在这种情况下是否可以使用mov指令而不是使用lea?
现在的处理器大多是 32 位或 64 位。这意味着它们处理的指令具有这个大小。
我们经常听说 32 位操作系统的 RAM 限制为 4GB=(2^32 位),因为 RAM 地址的长度需要保存在 32 位内。
但事实上,当我们查看指令的外观时,您通常需要不到 32 位来加载一个字。
以 x86mov指令为例,您有一个操作码、一个源地址和一个目标地址。
我的问题是,我们如何才能从 32 位长的地址加载某些内容?
我们是否总是需要在内存中某个位置有一个指向该地址的指针,该位置具有可在指令中使用的较小地址?
谢谢
想象一下,你有两个装配说明:
movl $10, %ecx
movl 0(%eax), %edx
Run Code Online (Sandbox Code Playgroud)
移动的CPI为1,内存的CPI为2.
对于第一行CPI = 1.对于第二行,CPI = 2还是3?我们总结进入内存(2个周期)+移动成本,还是只考虑对内存的访问?
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)