neg计算机组成原理,跪求(x-1)y指令(计算机组成原理)哪位高手帮我用汇编写一个( 爱问知识人...

这篇博客详细介绍了如何用汇编语言实现带符号数的乘法运算,并处理负数转换为无符号数的过程。通过递归和指令操作,展示了如何使用`?slong`和`?ulong`函数进行不同类型的输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

。model small

。stack 8192

。data

x dw -99

y dw 50

code

main: mov ax,@data

mov ds,ax

mov ax,x ;ax=x

dec ax ;ax=x-1

imul y ;带符号数整数乘法 dx:ax=ax*y

call ?slong

mov ah,4ch

int 21h

putc proc

push ax

mov ah,2

int 21h

pop ax

ret

putc endp

puts proc

push ax

mov ah,9

int 21h

pop ax

ret

puts endp

?slong proc ;?slong 输出DX:AX里的带符号数;?ulong 输出DX:AX里的无符号数

test dx,8000h ;是负数?

jz ?ulong ;否转无符号版本直接输出

push ax

push dx

mov dl,'-' ;先输出个负号

call putc

pop dx

push dx

call neg32 ;取相反数

call ?ulong ;输出相反数

pop dx

pop ax

ret

?ulong: push ax ;输出DX:AX里的无符号数

push bx

push cx

push dx

call @f

pop dx

pop cx

pop bx

pop ax

ret

@@: push ax

or ax,dx ;是0则直接输出

pop ax

jnz @f

mov dl,'0'

call putc

ret

@@: mov bx,ax ;把低16位先存一个到BX

mov ax,dx

xor dx,dx

mov cx,10

div cx ;高16位除以10

push ax ;留存高16位的商

mov ax,bx ;高16位的余数(已经在DX里了)

div cx ;和低16位再一块除以10

mov cx,ax ;低16位的商存个在CX里

or cx,dx ;若商与余数都为0则结束递归,跳转前先要留存结果等等

mov cx,dx ;留存DX中的余数以在递归后输出

pop dx ;恢复高16位的商,至此,DX:AX里是刚才整个除法的商,CX是余数

jz @f

push cx ;留存刚才DX:AX除10的余数,就是个位数,以在递归后输出(输出则是倒过来的)

call @b ;递归

pop dx ;从最高位的余数开始恢复并输出

add dl,'0'

call putc

@@: ret

?slong endp

neg32 proc ;注意对0x80000000(-2,147,483,648)返回的是CF=1且dx:ax不变(因为正值是溢出的)

cmp dx,8000h

jne @f

or ax,ax

jnz @f

stc

ret

@@: neg dx

neg ax

sbb dx,0

clc

ret

neg32 endp

end main。

全部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值