在Assembler x86中划分

时间:2015-10-13 17:44:09

标签: assembly x86

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

1。在Jasmin中创建一个新文档

2。使用AL-Register添加9到8。

3。减去2.

4。除以7。

我的解决方案是:

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

但我怎么除以7?我试过像div al,7这样的东西但是没有用。

4 个答案:

答案 0 :(得分:3)

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

source

所以,要在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会包含余数

答案 1 :(得分:2)

AX条指令which does division,但您需要先将红利放入Outlet(或其中一个兄弟姐妹)。

答案 2 :(得分:1)

dividiv指令没有立即使用的格式。它们仅采用一个显式操作数(寄存器或内存),而被除数在AX或DX:AX,EDX:EAX或RDX:RAX中隐含。  有关如何使用它们的信息,请参见this answer

但是16和32位模式下的x86确实具有立即除法指令,实际上它比Skylake之前的Intel CPU上的div r/m8稍快: aam 7将AL除以立即数7,将商数放在AH中,将余数放在AL中。https://agner.org/optimize/表示,在Haswell上,其延迟比div r8低1个周期,吞吐率比mov cl, 7高1个周期。并且这是8微秒而不是9。)

请注意,它与 div cl / mov 不同,后者将整个AX当作红利,将商置于AL中,将余数置于AH < / strong>。

AAM在64位长模式下不可用,已与其他不太有用的旧版BCD指令一起删除。但是,如果它整体上节省了uops(包括寄存器的立即数div r8),则可能会很有用。在Skylake上,它的成本为11微妙,而def get_image_data(): for row_number, row in enumerate(image_data): for column_number, cell in enumerate(row): if condition: # I need only coordinate of cell here print(row_number, column_number) 的成本为10微妙,吞吐量为1c 更差,并且延迟相同。

答案 3 :(得分:0)

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

.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