汇编:有符号十进制数显示程序

本文介绍两个版本的有符号十进制数显示程序,通过汇编语言实现,详细展示了如何处理正数、负数及零的显示,包括数字转换为ASCII码并输出的过程。程序使用了中断调用、循环、条件跳转等指令。

汇编:有符号十进制数显示程序

版本一

DATAS SEGMENT
    ;此处输入数据段代码 
    array dw 6789,-1234,0,1
DATAS ENDS


STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov cx,lengthof array
    xor bx,bx
again:mov ax,array[bx];
     call dispsiw;调用子程序显示一个数据
     add bx,type array
     call dispcrlf;换行以便显示下一个数据
     loop again
     jmp ex
dispsiw proc near
    push ax
    push bx
    push dx
    test ax,ax;判断是零、正数或负数
    jnz dsiw1;不是零,跳转
    mov dl,'0'
    mov ah,2
    int 21h
    jmp dsiw5;转向显示
dsiw1:jns dsiw2;是正数,跳转
    mov bx,ax
    mov dl,'-';是负数,显示负号
    mov ah,2
    int 21h
    mov ax,bx
    neg ax;数据求补(绝对值)
dsiw2:mov bx,10
    push bx;10压入堆栈,作为退出标志
dsiw3:cmp ax,0  ;数据(商)为零,转向保存
    jz dsiw4
    xor dx,dx   ;扩展被除数为DX.AX
    div bx  ;数据除以10:DX.AX÷10
    add dl,30h  ;余数(09)转换为ASCII
    push dx ;数据先低位后高位压入堆栈
    jmp dsiw3
dsiw4:pop dx
    cmp dl,10
    je dsiw5
    mov ah,2;
    int 21h
    jmp dsiw4
dsiw5:pop dx
    pop bx
    pop ax
    ret
dispsiw endp
dispcrlf proc near 
    push ax
    push dx
    mov dl,0dh  ;输出回车字符
    mov ah,2
    int 21h
    mov dl, 0ah  ;输出换行字符
    int 21h
    pop dx
    pop ax
    ret
dispcrlf endp
ex: mov al,4ch
    int 21h
CODES ENDS 
    END START

版本二

;eg504.asm
	.model small
	.stack
	.data
array	dw 6789,-1234,0,1,-9876,32767,-32768,5678,-5678,9000
count	= lengthof array
	.code
	.startup
	mov cx,count
	xor bx,bx
again:	mov ax,array[bx] 	;将AX=入口参数
	call dispsiw	;调用子程序,显示一个数据
	add bx,type array
	call dispcrlf	;光标回车换行以便显示下一个数据
	loop again
	.exit
dispsiw	proc	;显示有符号十进制数的通用子程序
	push ax	;入口参数:AX=欲显示的数据(补码)
	push bx
	push dx
	test ax,ax	;判断数据是零、正数或负数
	jnz dsiw1
	mov dl,'0'	;是零,显示“0”后退出
	mov ah,2
	int 21h
	jmp dsiw5
dsiw1:	jns dsiw2	;是负数,显示“-”
	mov bx,ax	;AX数据暂存于BX
	mov dl,'-'
	mov ah,2
	int 21h
	mov ax,bx
	neg ax	;数据求补(绝对值)
dsiw2:	mov bx,10
	push bx	;10压入堆栈,作为退出标志
dsiw3:	cmp ax,0	;数据(商)为零,转向显示
	jz dsiw4
	xor dx,dx	;扩展被除数DX.AX
	div bx	;数据除以10:DX.AX÷10
	add dl,30h	;余数(09)转换为ASCII码
	push dx	;数据各位先低位后高位压入堆栈
	jmp dsiw3
dsiw4:	pop dx	;数据各位先高位后低位弹出堆栈
	cmp dl,10	;是结束标志10,则退出
	je dsiw5
	mov ah,2	;进行显示
	int 21h
	jmp dsiw4
dsiw5:	pop dx
	pop bx
	pop ax
	ret	;子程序返回
dispsiw	endp

dispcrlf	proc	;回车换行子程序
	push ax	;保护寄存器
	push dx
	mov dl,0dh	;输出回车字符
	mov ah,2
	int 21h
	mov dl,0ah	;输出换行字符
	mov ah,2
	int 21h
	pop dx	;恢复寄存器
	pop ax
	ret	;子程序返回
dispcrlf	endp

	end
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值