乘法指令的提问(运算结果超出64位的处理)

MIPL_walikb 2008-11-16 12:11:26
简单的讲,比如我用mul指令,计算结果超出了64位,请问我要如何用十进制显示结果呢?
...全文
419 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
killbug2004 2008-11-16
  • 打赏
  • 举报
回复
在屏幕上打印出来可以先打印edx在打印eax,关键是把edx与eax中的数转换成十进制,通常有两种方法
一是查表而是辗转相除,知道方法就不难,我就不帮你写了
查表法的例子(键盘接受输入十六进制显示输入字符的asicc码):
.model small 
.386
.data
hchar db '0123456789abcdef'
x db ?
.CODE
START:
mov ax,@data
mov ds,ax

mov ah,1
int 21h
mov x,al

push ax
mov dl,0ah
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
pop ax
shr al,4
movzx si,al
mov dl,hchar[si]
mov ah,2
int 21h

mov al,x
and al,0fh
movzx si,al
mov dl,hchar[si]
mov ah,2
int 21h

mov dl,'H'
mov ah,2
int 21h

mov ah,4ch
int 21h
END START


下面的例子是十进制显示num,不过是byte,辗转相除法
data segment 
num db 01Fh
data ends

stack segment STACK
db 256 dup(0)
tos label word
stack ends
code segment
assume cs:code,ds:data
begin:
mov ax,0d
mov ax,0dh
mov ax,data
mov ds,ax
mov es,ax

mov ax,stack
mov ss,ax
mov sp,offset tos

xor ax,ax
mov al,num
xor cx,cx
;下面是将cout中的数以十进制显示出来
DoDiv:
mov bl,10
div bl ;al←ax/10的商
;ah←ax/10的余数
push ax ;保存结果
inc cx
xor ah,ah ;ah清零,清除余数
cmp al,0 ;判断商是否为零
jnz DoDiv

DoPrt:
pop dx ;dx中保存的是每次除的结果
xchg dh,dl
add dl,30h ;dl中的数字是每次除后的商,将其表示成ascii
mov ah,2
int 21h
loop DoPrt

exit:
mov ax,4c00h ;退出DOS
int 21h
code ends
end begin

MIPL_walikb 2008-11-16
  • 打赏
  • 举报
回复
不很理解,汇编中乘除法的溢出概念我没看过相应的讨论

我初学汇编,之前就学到乘除法指令了,比如用mul,用两个双字(dword)相乘,结果存储在 edx.eax 这时候,我如何用十进制在屏幕上打印出这个edx.eax中的值呢??
xiaopoy 2008-11-16
  • 打赏
  • 举报
回复
mul会设置CF OF
carry flag溢出标志

实际上mul溢出一位还可以表示。
MIPL_walikb 2008-11-16
  • 打赏
  • 举报
回复
自己顶个,继续提问,大家帮忙

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧