assembly - 汇编 - 为什么这些代码块输出不同?
问题描述
为什么这些操作的结果不一样:
str db "%d",0
mov eax, 67305985
push eax
push str
call [printf]
pop eax
pop eax
打印 67305985,就像它应该的那样
str db "%d",0
mov eax, 67305985
mov ebx, eax
shr ebx, 16
mov [esp-1], bh
mov [esp-2], bl
mov ebx, eax
mov [esp-3], bh
mov [esp-4], bl
push str
call [printf]
pop eax
pop eax
打印我不明白的 1964082724
解决方案
堆栈向下增长。下面的内存ESP
指向哪里可以被各种中断自由使用。
您需要保留下面的内存ESP
供自己使用。只需减去 4 即可ESP
。
mov eax, 67305985
sub esp, 4
mov [esp], al
mov [esp+1], ah
shr eax, 16
mov [esp+2], al
mov [esp+3], ah
push str
call [printf]
pop eax
pop eax
...
如果您首先存储低字节,则不需要额外的寄存器。
推荐阅读
- java - Java GridBagLayout 在编译时默认左上角
- mysql - SQL分组后如果组中存在值,则决定输出
- angular - 如何在 Angular Observable 订阅函数中正确设置值
- typescript - 如何将 ts 文件捆绑到一个 index.d.ts 文件中?
- css - Github页面markdown表太宽,使用overflow-x:添加代码块后滚动不起作用
- matlab - 找到具有最低最大值的行/列
- java - 在 Java LinkedListArray 中创建循环并使方法 detectLoop 返回 true
- bash - 使用 bash 计算多列的总和
- python - 基于公共字段将表 1 连接到表 2
- python-3.x - 自定义 spacy 停用词并保存模型