王爽《汇编语言》(第四版)第十章 实验十

10.1、显示字符串

assume cs:code

data segment
	db 'Welcome to masm!',0
data ends

code segment
start:	
		mov dh,8
		mov dl,3
		mov cl,2
		mov ax,data
		mov ds,ax
		mov si,0
		call show_str
		
		mov ax,4c00h
		int 21h
		
show_str:
		push ax
		push bx
		push cx
		push dx
		push di
		
		mov al,160
		mul dh		;ax存放行地址
		mov bl,dl
		mov bh,0
		inc bx		;显示一个字符占用两个字节
		add ax,bx	
		mov di,ax	;di中存放打印的首地址
		
		mov bx,0b800h
		mov es,bx
		
		mov bx,0
		mov al,cl
	s:	mov cl,ds:[bx]
		mov ch,0
		jcxz ok
		mov es:[di],cl
		mov es:[di+1],al
		add di,2
		inc bx
		jmp short s		
		
	ok:	pop di
		pop dx
		pop cx
		pop bx
		pop ax
		ret
		
code ends
end start

10.2解决除法溢出的问题

对于32位的被除数,先高位的16位在前面补0组成一个32位数除以除数,得到的商便是最终结果的高16位,而得到的余数作为一个新的32位数的高16位,而被除数的低16位作为新32位数中的低16位,除以被除数,得到的余数就是最终的余数,而得到的商就是结果的低16位

assume cs:codesg,ss:stack

stack segment
	dw 16 dup (0)
stack ends

codesg segment
start:	
		mov ax,stack
		mov ss,ax
		mov sp,32
		
		mov ax,4240h
		mov dx,0fh
		mov cx,0ah
		call divdw
		
		mov ax,4c00h
		int 21h
				
divdw:		
		mov si,ax	;先高位除以被除数,暂存ax
		
		mov ax,dx
		mov dx,0	;除数16位,被除数应为32位,高位存储在dx中
		div cx
		mov bx,ax	;bx存储商
		
		mov ax,si	;取出低位的值,上次除法的余数留在dx中作为这次除法的高16位,ax作为低16位
		div cx	;ax作为最终的商的低16位
				
		mov cx,dx	
		mov dx,bx	;第一次除法的商作为最终的商的高16位
		
		ret

codesg ends
end start

10.3数据显示

assume cs:code,ss:code

data segment
	db 10 dup (0)
data ends

stack segment
	dw 256 dup (0)
stack ends

code segment
start:	
		mov ax,12666
		mov bx,data
		mov ds,bx
		
		mov bx,stack
		mov ss,bx
		mov sp,200h
		
		mov si,0
		call dtoc
		
		
		mov dh,8
		mov dl,3
		mov cl,2
		call show_str
		
		mov ax,4c00h
		int 21h

dtoc:	
		push ax
		push bx
		push cx
		push dx
		push di

		mov di,0	;保存余数的个数
	s3:	mov dx,0
		mov bx,10
		div bx
		mov cx,ax	;商
		push dx	;保存余数进栈
		inc di	;每次进栈,余数个数加一
		jcxz s1    ;商为0时,所有余数已经进栈,可跳转s1进行字符转换后存储至数据段中
				
		jmp short s3
		
   s1:	
		mov cx,di    ;余数个数,也即循环次数
		mov bx,si    ;数据要保存的偏移地址,由调用方传递进来
		
	s0:	pop ax
		add al,30h
		mov ds:[bx],al
		inc bx
		loop s0
		mov byte ptr ds:[bx],0	;字符串结尾补0
		
		pop di
		pop dx
		pop cx
		pop bx
		pop ax
		ret	

show_str:
		push ax
		push bx
		push cx
		push dx
		push di
		
		mov al,160
		mul dh		;ax存放行地址
		mov bl,dl
		mov bh,0
		inc bx		;显示一个字符占用两个字节
		add ax,bx	
		mov di,ax	;di中存放打印的首地址
		
		mov bx,0b800h
		mov es,bx
		
		mov bx,0
		mov al,cl
	s:	mov cl,ds:[bx]
		mov ch,0
		jcxz ok
		mov es:[di],cl
		mov es:[di+1],al
		add di,2
		inc bx
		jmp short s		
		
	ok:	pop di
		pop dx
		pop cx
		pop bx
		pop ax
		ret
		
code ends
end start

进行debug跟踪,除错,并观察执行过程中的寄存器变化情况,最终数据可以按照需求进行正常显示到屏幕中。如下图

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值