在阅读有关汇编程序的文章时,我经常遇到人们在写文件时他们推送处理器的某个寄存器并稍后再次弹出它以恢复它之前的状态.
我正在通过paul caurter从PC 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) 我编译了以下程序:
#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) 我试图在汇编中进行简单的乘法操作,但由于某种原因,我没有看到寄存器在标记MUL功能时发生变化.
mov bx, 5
mov cx, 10
mul cx
Run Code Online (Sandbox Code Playgroud)