- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让 idiv
正常工作,并且我已经读到您输入了您想要划分的内容例如 25,然后在 ebx
中输入您想要除以的内容,例如 5,然后就可以了
idiv ebx
然后将 EAX
= 5 和 EDX
= 0。
但是在我的程序中它并没有这样做,我所做的输入是100000000
输出:
千字节:100000000
兆字节:1869375819
想知道我在这里做错了什么吗?
%include "asm_io.inc"
;
; initialized data is put in the .data segment
;
segment .data
prompt db "Please enter the number of bytes:", 0
param db "1 = Calculate it in kilobytes", 0Ah, "2 = Calculate it in megabytes", 10, 0
output db "Kilobytes: %d", 0Ah, "MegaBytes: %d", 10, 0
;
;
segment .bss
;
input resd 1
input2 resd 1
choice resd 1
;
; code is put in the .text segment
;
segment .text
global asm_main
extern printf
asm_main:
enter 0,0
pusha
mov eax, prompt
call print_string
call read_int
mov [input], eax
mov [input2], eax
sub esp, 10h
push dword [output]
push dword [input2]
push dword [input]
mov eax, param
call print_string
call read_int
cmp eax, 1
je kilobyte; Jump if eax is equal to 1
cmp eax, 2
je megabyte; Jump if eax equal to 2
kilobyte:
pop eax ; Pop input into eax
cdq
mov ebx, 1024 ; Put 1024 into ebx
idiv ebx ; EAX = 100000000/1024 = 97656
mov [input], eax ; Move 97656 into var=input
push dword [input] ; Put into stack
jmp megabyte
megabyte:
pop eax ; Pop input into eax
cdq
mov ebx, 1048576 ; Put 1048576 into ebx
idiv ebx ; EAX = 100000000/1024 = 95
mov [input2], eax ; Move 95 into var=input
push dword [input] ; Put into stack
jmp printOut
printOut:
mov dword [esp], output
call printf
add esp, 4 * 3
add esp, 10h
popa
mov eax, 0
leave
ret
更新
好吧,我输入了xor edx, edx
,但我仍然得到与以前相同的输出。我查看了我的电子书和其他网站,它说的是同样的事情,所以我真的不确定我做错了什么。也尝试了 idiv
路线,但没有成功。
最佳答案
首先,为了实现您需要的目标(计算兆字节和千字节),您实际上需要无符号设备。因此,请使用 div
指令而不是 idiv
。
其次,div
和idiv
实际上是将edx:eax
中的64位数字除以指定为操作数的32位数字。但是您的 edx 寄存器包含随机数。
因此,在除法之前,您必须将eax
中的数字扩展为64位。
对于idiv
使用:
cdq ; convert signed 32bit number in eax into signed 64bit in edx:eax
idiv ebx
对于 div
使用:
xor edx, edx ; set edx to 0 in order to extend unsigned eax in edx:eax
div ebx
您的打印代码看起来错误:
kilobyte:
pop eax ; Pop input into eax
cdq
mov ebx, 1024 ; Put 1024 into ebx
idiv ebx ; EAX = 100000000/1024 = 97656
mov [input], eax ; Move 97656 into var=input
push dword [input] ; Put into stack
jmp megabyte
megabyte:
pop eax ; Pop input into eax
cdq
mov ebx, 1048576 ; Put 1048576 into ebx
idiv ebx ; EAX = 100000000/1024 = 95
mov [input2], eax ; Move 95 into var=input
push dword [input] ; Put into stack
jmp printOut
printOut:
mov dword [esp], output
call printf
add esp, 4 * 3
首先为什么要跳转到下一个地址??? CPU 会自己到达那里。这并不完全是错误,而是降低了代码的可读性,并且是多余的。
mov [input2], eax ; Move 95 into var=input
push dword [input] ; Put into stack
printOut:
mov dword [esp], output
call printf
add esp, 4 * 3
在这里你可以看到,结果存储在[input2]中,但[input]被压入堆栈中。为什么?下一条指令mov dword [esp],output
覆盖堆栈中最后推送的值。
请注意,push 指令首先递减 esp
,然后将推送的值存储在 [esp] 中。这里您需要推送输出
。
关于assembly - 基于 intel 的汇编语言 idiv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19853012/
我是Intel pin工具的新手,最近开始研究pin工具。在教程中,描述了pin工具的模式: Sometimes, however, it can be useful to look at diffe
我是Intel pin工具的新手,最近开始研究pin工具。在教程中,描述了pin工具的模式: Sometimes, however, it can be useful to look at diffe
我得到了这份工作:1。产生一个正弦信号。2。使用 FFT 构建其频谱。首先,我为 visual studio 2010 安装了 Intel Parallel Studio XE 2011。在 vs 2
看起来 Intel 提供了许多 OpenCL 实现。 ArchWiki描述 OpenCL 实现。它说 beignet 和 intel-opencl 已弃用。那么,intel-compute-runti
我正在尝试通过阅读 Intel Intrinsics Guide 来开始使用 AVX512 内在函数但到目前为止我发现它没有定义命名数据类型或用于解释的伪代码语法。没有这样的定义,所谓的指南对我起码没
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
在 Android SDK 管理器中,我可以看到 3 种类型的 Intel Atom 图像。有人可以解释“Intel Atom Image”、“Google APIs Intel Atom Image
我写了这个 pintool: #include "pin.H" #include #include VOID Instruction(INS ins, VOID *v) { cou
我正在尝试了解 _mm256_permute2f128_ps() 的作用,但无法完全理解 intel's code-example . DEFINE SELECT4(src1, src2, contr
我正在开发一个性能关键应用程序,该应用程序必须移植到仅支持 MMX、SSE、SSE2 和 SSE3 的英特尔凌动处理器中。我以前的应用程序支持 SSSE3 和 AVX,现在我想将其降级为 Intel
我有最新版本的 Intel Pin 3.0 版本 76887。 我有一个支持 MPX 的玩具示例: #include int g[10]; int main(int argc, char **arg
我想研究和比较elf、SPARC和PA-RISC的可执行文件结构。 为了进行研究,我想在 Intel 机器 (Core2Duo) 上安装 OpenSolaris。 但我有一个基本的疑问,它会起作用吗?
我尝试使用 g++ 用 intel mkl 11.1 进行编译: g++ -m32 test.c -lmkl_intel -lmkl_intel_thread -lmkl_core -liomp5 -
我正在按照以下说明进行操作: https://software.intel.com/en-us/articles/building-boost-with-intel-c-compiler-150 Co
我正在尝试在我的 C 程序中使用内联汇编程序 __asm,使用 Intel 语法而不是 AT&T 语法。我正在使用 gcc -S -masm=intel test.c 进行编译但它给出了错误。下面是我
我是 OpenCL 的新手,目前对其性能有一些疑问。 我有 Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz + ubuntu + Beignet(Intel 开源 op
我在/ex 文件夹中有一个 main.f90。 f77 子程序文件在/ex/src 中。子程序文件再次使用 BLAS 和 LAPACK 库。对于 BLAS 和 LAPACK,我必须使用英特尔数学核心函
我的团队最近从 2015 年英特尔编译器(并行工作室)升级到 2018 年版本,我们遇到了一个链接器问题,让每个人都焦头烂额。 我有以下类(为简洁起见进行了适度编辑),用于处理子进程的包装以及与它们对
在最后几天,我观察到我无法解释的新工作站的行为。对这个问题做一些研究,INTEL Haswell architecture 中可能存在一个可能的错误。以及在当前的 Skylake Generation
我的 HAXM 安装存在问题。事情是这样的。每次尝试为我的计算机安装 HAXM 时,我都会收到此错误: 问题是,我的计算机支持虚拟化技术(见下图)。知道如何解决这个问题吗? 最佳答案 只需执行以下步骤
我是一名优秀的程序员,十分优秀!