- 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/
看看这段代码 int main() { int i = 1U << 31; // assume this yields INT_MIN volatile int x; x =
在 intel 指令中,idiv(integer divsion) 表示有符号除法。 我得到了 idiv 的结果,但我不太明白结果。 - 示例 0xffff0000 idiv 0xffff1100 -
我正在尝试让 idiv 正常工作,并且我已经读到您输入了您想要划分的内容例如 25,然后在 ebx 中输入您想要除以的内容,例如 5,然后就可以了 idiv ebx 然后将 EAX = 5 和 EDX
据我所知,idiv %ebx 会将 edx:eax(按顺序连接成 64 位值)与 32 位 ebx. 但是,当我尝试将 0x00000000:0xfffffffb(0 和 -5)除以 0xffffff
我目前正在编写一个简单的 C 编译器,它将 .c 文件作为输入并生成汇编代码(X86、AT&T 语法)。一切都很好,但是当我尝试执行 IDIVQ 指令时,出现浮点异常。这是我的输入: int myma
我想知道这是否适用于 Krait 400 CPU。我听从了一些建议 here 当我使用 mcpu=cortexa15 编译时,代码会编译并有效地在程序集转储中看到 udiv 指令。 但是,我想知道:
我正在帮助我的一个 friend 调试他的程序,我们将其缩小到一个甚至在这里也会发生的问题: .MODEL small .STACK 16 .CODE start: mov ax, 044c0
我在这里使用 Visual C++ 2008 (9.x),当我遇到编译器生成 DIV 而不是 IDIV 时,我正在准备一个定点值。我将代码折叠成一小段以准确重现: short a = -255; sh
我正在处理经常使用一些重要优化的代码。 是什么 #define idiv(a, b) (((a) + (b) / 2) / (b)) 用于?为什么不简单 #define idiv(a, b) ((a)
谁能为我解释为什么在这些情况下余数的符号不同?这是模拟器错误还是真正的 CPU 也会这样做? 8 / -3 : quotient(AL) = -2 remainder(AH) = 2 -8 / 3
我是一名优秀的程序员,十分优秀!