王爽 汇编 在课程设计1中! 在屏幕上显示 十进制数据
比如 数值5937000 十六进制为5A 9768 按书上 让÷10 得到余数
可是数值有点大 要怎么处理?
是先5A 9768÷10=90f24 在90f24÷10得到余数??如果这样得到余数 就少了一个0要肿么办?
课程设计1 出不来 就是因为这个弄不懂~ 百度好几天了
实在没有办法 在线等高手解答 求详细注释 或者 过程
------解决思路----------------------
噢天,这不是8086汇编?
你甚至可以加一个.8086去限制它只用8086代码!
副程序可以随时拿去用,dx放入高值,ax放低值
最大可以转换FFFF:FFFF = 4294967295
若只要FFFF (65535),清除dx就可以了
换一套比较传统的模版,也加了解释,希望对你有帮助
.8086
DATA SEGMENT
num dd 5A9768h
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
start:
mov ax,data
mov ds,ax
mov ax,word ptr num ;low word
mov dx,word ptr num + 2 ;high word
call print_dec ;output to screen
MOV AX,4C00H
INT 21H
;----------------------------------------
print_dec:
;input : dx-high word, ax-low word
;output : display dec digit to screen
push ax
push bx
push cx
push dx
push si
push bp
xor cx,cx
xchg bp,dx ;save high word to bp
mov si,000ah ;10
mov bx,30h
count1: or bp,bp ;is it zero
jz count2 ;yes, high word finish
xchg bp,ax ;exchange high and low word
xor dx,dx ;clear dx
div si ;div by 10
xchg bp,ax ;exchange low and result word
div si ;div by 10
or dl,bl ;change to ascii
push dx ;store it
inc cx ;no. of byte
jmp short count1 ;next
count2: xor dx,dx ;clear dx
div si ;div by 10
or dl,bl ;change to ascii
push dx ;store it
inc cx ;no. of byte
or ax,ax ;is it finish
jnz count2 ;no, next
count3: pop dx ;get byte
mov ah,02 ;print char
int 21h
loop count3 ;next byte
pop bp
pop si
pop dx
pop cx
pop bx
pop ax
ret
;----------------------------------------
code ends
end start
------解决思路----------------------
书上不是 说了 一个 长除法吗??
ax = 16位 低位
dx = 16位 高位
cx = 除数 10 返回的时候 cx = 余数 然后对余数进行处理 我去写一下代码
------解决思路----------------------
assume cs:code,ds:data,ss:stack
data segment
num dd 53970000,0,512321,22,333
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
call init_reg
call outPut_num
mov ax,4c00H
int 21H
;==============================================
to_string:
push ax
push bx
push cx
push dx
push di
mov ax,ds:[bx].0 ;低16位
mov dx,ds:[bx].2 ;高16位
call is_div
pop di
pop dx
pop cx
pop bx
pop ax
ret
;==============================================
is_div: push ax ;函数long_div ret2 的原因
mov cx,10
call long_div
add cx,30H ;字符化处理
mov es:[di],cl
sub di,2 ;第一个是个位数
mov cx,dx
jcxz isAxZero
jmp is_div
isAxZero: mov cx,ax
jcxz isDivRet
jmp is_div ;ax 和 dx 都等于0 说明数字除完了 否则继续除
isDivRet: ret
;==============================================
long_div: mov bp,sp
mov ax,dx
mov dx,0 ;具体 你看 王爽书最后的的解释
div cx
push ax
mov ax,ss:[bp+2]
div cx
mov cx,dx
pop dx
ret 2 ;pop ip add sp,2
;==============================================
outPut_num:
mov bx,OFFSET num ;结构
mov cx,5
mov di,160*10 + 20*2 ;显示的位置
outPutNum: call to_string
add di,160
add bx,4
loop outPutNum
ret
;==============================================
;初始化 寄存器
init_reg: mov bx,0B800H
mov es,bx
mov bx,data
mov ds,bx
ret
code ends
end start
------解决思路----------------------
http://blog.csdn.net/misskissc/article/details/41964049
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax) = dword型数据的低16位,(dx) = dword型数据的高16位,(cx) = 除数
;返回:(dx) = 结果的高16位,(ax) = 结果的低16位,(cx) = 余数
divdw:
push bx
push si
mov bx,ax
mov ax, dx
mov dx, 0
div cx ;ax = int(H/N), dx = rem(H/N)
mov si, ax ;si =int(H/N), (dx) = rem(H/N) * 65536
mov ax, bx
div cx ;(rem(H/N) * 65536 + L) / N, ax保存的低16位商,(dx) = 余数
mov cx, dx
mov dx, si
pop si
pop bx
retf