相关疑难解决方法(0)

在x86汇编中寄存器上使用的push/pop指令的功能是什么?

在阅读有关汇编程序的文章时,我经常遇到人们在写文件时他们推送处理器的某个寄存器并稍后再次弹出它以恢复它之前的状态.

  • 怎么能推一个寄存器?它在哪里推?为什么需要这个?
  • 这可归结为单处理器指令还是更复杂?

x86 assembly stack terminology

79
推荐指数
5
解决办法
26万
查看次数

理解汇编语言的mul和imul指令的问题

我正在通过paul caurterPC Assembly学习80386

  mul source
Run Code Online (Sandbox Code Playgroud)
  • 如果操作数是字节大小,则将其乘以AL寄存器中的字节,结果存储在AX的16位中.

精细.

  • 如果源是16位,则将其乘以AX中的字,32位结果存储在DX:AX中.

Q1:为什么选择DX:AX?为什么它不能存储在EAX/EDX中?

imul 真是令人困惑

imul dest, source1
imul dest, source1, source2
Run Code Online (Sandbox Code Playgroud)

alt text http://img697.imageshack.us/img697/8976/imul.gif

我在理解表格方面遇到了问题.

Q2:在表的第2个条目中.再次,为什么DX:AX.为什么不EAX或EDX?

现在考虑以下代码片段:

imul eax ; edx:eax = eax * eax
mov ebx, eax ; save answer in ebx
mov eax, square_msg ; square_msg db "Square of input is ", 0
call print_string ; prints the string eax
mov eax, ebx 
call print_int ;  prints the int stored in eax
call …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm

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

为什么imul用于乘以无符号数?

我编译了以下程序:

#include <stdint.h>

uint64_t usquare(uint32_t x) {
  return (uint64_t)x * (uint64_t)x;
}
Run Code Online (Sandbox Code Playgroud)

这拆解为:

 0: 89 f8                   mov    eax,edi
 2: 48 0f af c0             imul   rax,rax
 6: c3                      ret  
Run Code Online (Sandbox Code Playgroud)

但是imul用于乘以有符号数字的指令.那为什么用gcc呢?

/ edit:使用uint64_t程序集时类似:

0:  48 0f af ff             imul   rdi,rdi
4:  48 89 f8                mov    rax,rdi
7:  c3                      ret  
Run Code Online (Sandbox Code Playgroud)

x86 assembly unsigned x86-64 multiplication

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

装配中的MUL功能

我试图在汇编中进行简单的乘法操作,但由于某种原因,我没有看到寄存器在标记MUL功能时发生变化.

mov bx, 5    
mov cx, 10

mul cx
Run Code Online (Sandbox Code Playgroud)

x86 assembly multiplying

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