gpt4 book ai didi

assembly - 基于 intel 的汇编语言 idiv

转载 作者:行者123 更新时间:2023-12-02 22:14:35 28 4
gpt4 key购买 nike

我正在尝试让 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

其次,dividiv实际上是将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

关于 printint

您的打印代码看起来错误:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com