相关疑难解决方法(0)

为什么整数除以零会导致浮点异常?

在C程序中除以零会导致错误消息的异常终止Floating point exception (core dumped).这对于浮点除法并不足为奇,但为什么在整数除以零时会这样说呢?整数除法实际上是否使用引擎盖下的FPU?

(顺便说一下,这都是在x86下的Linux上.)

c divide-by-zero

15
推荐指数
3
解决办法
4030
查看次数

为什么在这个函数序言中没有"sub rsp"指令,为什么函数参数存储在负rbp偏移量?

这就是我通过阅读一些内存分段文档所理解的:当调用一个函数时,有一些指令(称为函数序言)将帧指针保存在堆栈上,将堆栈指针的值复制到基本指针中并保存一些局部变量的内存.

这是我尝试使用GDB调试的一个简单代码:

void test_function(int a, int b, int c, int d) {
    int flag;
    char buffer[10];

    flag = 31337;
    buffer[0] = 'A';
}

int main() {
    test_function(1, 2, 3, 4);
}
Run Code Online (Sandbox Code Playgroud)

调试此代码的目的是了解调用函数时堆栈中发生的情况:因此我必须在执行程序的各个步骤(在调用函数之前和执行期间)检查内存.虽然我设法通过检查基指针来查看返回地址和保存的帧指针之类的东西,但我真的无法理解在反汇编代码之后我要写的内容.

拆解:

(gdb) disassemble main
Dump of assembler code for function main:
   0x0000000000400509 <+0>: push   rbp
   0x000000000040050a <+1>: mov    rbp,rsp
   0x000000000040050d <+4>: mov    ecx,0x4
   0x0000000000400512 <+9>: mov    edx,0x3
   0x0000000000400517 <+14>:    mov    esi,0x2
   0x000000000040051c <+19>:    mov    edi,0x1
   0x0000000000400521 <+24>:    call   0x4004ec <test_function>
   0x0000000000400526 <+29>:    pop    rbp
   0x0000000000400527 <+30>:    ret    
End …
Run Code Online (Sandbox Code Playgroud)

c assembly stack x86-64 red-zone

5
推荐指数
1
解决办法
1311
查看次数

64位鼻子师idiv

;print out division message
mov rcx, 0                       ;zero out register
mov rax, [input]
mov rcx, [input2]
idiv rcx                        ;divide rax by rcx
mov rdi, rax                    ;for printing purposes
call print_int
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚为什么这不是分裂,我得到一个enrror"浮点异常"我使用64位机器,值是整数而不是浮点....想法?

我知道在除法发生之后,商应该是rax,剩下的应该是rdx我相信,但是现在我只是试着把手放在商上.

assembly x86-64 nasm

3
推荐指数
1
解决办法
1万
查看次数

nasm idiv 为负值

尝试将正数除以负数。

目前我的程序将正确划分,并且我可以正确访问其余部分。

但是当我输入一个正数除以一个负值时,它根本不会除。

我知道有一种方法可以“签名扩展”并且它会正确划分。我只是看不懂说明书

movsss $imm/%reg %reg/mem 移动,符号扩展 231 movzss $imm/%reg %reg/mem 移动,零扩展

当然那是 att 语法,我需要 intel 语法

这是我的代码

xor rdx, rdx
mov rax, [input]
mov rcx, [input2]
idiv rcx
Run Code Online (Sandbox Code Playgroud)

想法如何除以负数?

assembly x86-64 nasm integer-division

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

标签 统计

assembly ×3

x86-64 ×3

c ×2

nasm ×2

divide-by-zero ×1

integer-division ×1

red-zone ×1

stack ×1