Assembly 汇编程序x86中的除法

Assembly 汇编程序x86中的除法,assembly,x86,Assembly,X86,我的大学给了我一个练习: 一,。在Jasmin中创建新文档 二,。使用AL寄存器将9添加到8 三,。减去2 四,。除以7 我的解决办法是: mov al,9 add al,8 sub al,2 但是我怎么除以7呢?我尝试了类似于div al,7的方法,但不起作用。有一条div指令,但您需要先将红利放入AX(或其同级之一)。有一条div指令,但您需要将红利放入AX(或其同级之一)首先。div操作将AX、DX:AX或EDX:EAX寄存器中的值(被除数)除以源操作数(除数),并将结果存储在AX(AH

我的大学给了我一个练习:

一,。在Jasmin中创建新文档

二,。使用AL寄存器将9添加到8

三,。减去2

四,。除以7

我的解决办法是:

mov al,9
add al,8
sub al,2

但是我怎么除以7呢?我尝试了类似于
div al,7
的方法,但不起作用。

有一条
div
指令,但您需要先将红利放入
AX
(或其同级之一)。

有一条
div
指令,但您需要将红利放入
AX
(或其同级之一)首先。

div
操作将AX、DX:AX或EDX:EAX寄存器中的值(被除数)除以源操作数(除数),并将结果存储在AX(AH:AL)、DX:AX或EDX:EAX寄存器中

所以,要在al中划分值,需要执行以下操作:

mov ah, 0 # clean up ah, also you can do it before, like move ax, 9
mov bl, 7 # prepare divisor
div bl # al = ax / bl, ah = ax % bl

在此之后,al将包含商,ah将包含余数

div
操作将AX、DX:AX或EDX:EAX寄存器(被除数)中的值除以源操作数(除数),并将结果存储在AX(ah:al)、DX:AX或EDX:EAX寄存器中

所以,要在al中划分值,需要执行以下操作:

mov ah, 0 # clean up ah, also you can do it before, like move ax, 9
mov bl, 7 # prepare divisor
div bl # al = ax / bl, ah = ax % bl

在此之后,al将包含商,ah将包含余数

此代码仅适用于单位数除法

.model small
.data
 msg1 db 'enter dividend:$'
 msg2 db 10,13,'enter divisor:$'
 result db 10,13,'result is:$'
 dividend db ?
 divisor db ?
.code
.startup
mov ax,@data
mov ds,ax
mov ah,9
lea dx,msg1
int 21h
mov ah,1
int 21h
sub al,30h
mov dividend ,al
mov ah,9
lea dx,msg2
int 21h
mov ah,1
int 21h
sub al,30h
mov divisor , al
mov al,dividend
mov bl,divisor
mov ah,0
div bl
mov ah,9
lea dx,result
int 21h
mov ah,2
add al,30h
mov dl,al
int 21h
mov ah,4ch
int 21h
end

此代码仅适用于一位数除法

.model small
.data
 msg1 db 'enter dividend:$'
 msg2 db 10,13,'enter divisor:$'
 result db 10,13,'result is:$'
 dividend db ?
 divisor db ?
.code
.startup
mov ax,@data
mov ds,ax
mov ah,9
lea dx,msg1
int 21h
mov ah,1
int 21h
sub al,30h
mov dividend ,al
mov ah,9
lea dx,msg2
int 21h
mov ah,1
int 21h
sub al,30h
mov divisor , al
mov al,dividend
mov bl,divisor
mov ah,0
div bl
mov ah,9
lea dx,result
int 21h
mov ah,2
add al,30h
mov dl,al
int 21h
mov ah,4ch
int 21h
end
idiv
指令没有立即生效的表单。它们只接受一个显式操作数(寄存器或内存),被除数在AX、DX:AX、EDX:EAX或RDX:RAX中是隐式的。 请参阅以了解如何使用它们

但是16位和32位模式下的x86确实有一条立即除法指令,实际上比Skylake之前的Intel CPU上的
div r/m8
稍快:将AL除以立即数7,商用AH表示,余数用AL表示。(表示在Haswell上,它的延迟比
div r8
低1个周期,吞吐量比
div r8高1个周期。它是8个uops,而不是9个uops。)

请注意,它不同于
mov cl,7
/
div cl
,它将整个AX作为股息,并将商放在AL中,剩余部分放在AH中

AAM在64位长模式下不可用,与其他不太有用的传统BCD指令一起删除。但如果它整体保存UOP(包括
mov
寄存器的立即数),它可能很有用。在Skylake上,它的成本为11 uops,而div r8的成本为10 uops,并且吞吐量更低,延迟也相同。

idiv
指令没有采用立即数的形式。它们只采用一个显式操作数(寄存器或内存),股息隐含在AX或DX:AX、EDX:EAX或RDX:RAX中。 请参阅以了解如何使用它们

但是16位和32位模式下的x86确实有一条立即除法指令,实际上比Skylake之前的Intel CPU上的
div r/m8
稍快:将AL除以立即数7,商用AH表示,余数用AL表示。(表示在Haswell上,它的延迟比
div r8
低1个周期,吞吐量比
div r8高1个周期。它是8个uops,而不是9个uops。)

请注意,它不同于
mov cl,7
/
div cl
,它将整个AX作为股息,并将商放在AL中,剩余部分放在AH中


AAM在64位长模式下不可用,与其他不太有用的传统BCD指令一起删除。但如果它整体保存UOP(包括
mov
寄存器的立即数)在Skylake上,
div r8
的成本为11 uops,而
div r8
的成本为10 uops,吞吐量和延迟相同。
div
如何知道它应该除以AX,DX:AX还是EDX:EAX?@S.Eberl取决于参数,bl,bx,ebx->AX,DX:AX,EDX:eaxSo,如果我除以bl,它会自动除以AX?@S.Eberl是的8位参数它将除以ax,对于任何16位参数-dx:ax谢谢!最后一个问题:我可以输出ax吗?或者我如何看到ax的值?如何知道它应该除以ax,dx:ax还是EDX:EAX?@S.Eberl取决于参数,bl,bx,ebx->ax,dx:ax,EDX:eaxSo,如果我除以bl,它将自动除以ax?@S.Eberl是,对于任何8位参数,它将除以ax,对于任何16位参数-dx:ax谢谢!最后一个问题:我可以输出ax吗?或者我如何看到ax的值?