南邮 微机原理 第四章作业第二题

假设数据段从BUF单元开始,存有20个8位无符号数,如下:

BUF DB 45,76H,10001010B,-4,188,255,14H,'A58a',0FFH,66H,100,-100,-50,150,200,34,11011001B

则这20个数值中大于100的数据一共____个。

解答:20.首先,一字节无符号数0-255,无符号数负数,即负数内存中用补码表示,人为读取的时候忽略符号位。如-4补码:0FCH,无符号数读作:252。溢出的正数,如+255,内存中表示为11111111B,读取为有符号数溢出,那就是-1,如果读取为无符号数那就是255有符号数或者无符号数是后天定义的。

(100是64H) 76H,10001010B,-4,188,255,('a'=61H),0FFH,66H,-100,-50,150,200,11011001B

需要注意的是,无符号数比较大小需要用JA,JNA,JC,JNC来比较,和有符号数区别开来。原因是有符号数首先比较符号位。

dx的转成10进制输出的代码参考了:二进制转换成十进制的汇编程序-CSDN社区,也可以简单粗暴用dl来计数,add dl,30h,DOS调用输出,如果超过9可以查表得到

代码如下:

DATAS SEGMENT 
NUM DB 45,76H,10001010B,-4,188,255,14H,'A58a',0FFH,66H,100,-100,-50,150,200,34,11011001B
DATAS ENDS;‘A58a’是以字节保存的4个ASII数,无符号数负数还是用补码表示
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS 
START:
    MOV AX,DATAS 
    MOV DS,AX ;MOV指令只能将寄存器操作数赋值给段寄存器
    MOV BX,OFFSET NUM ;把DATAS的段偏移赋值给BX 16位寄存器
    MOV CX,20 ;LOOP循环次数是20
    MOV DX,0 ;DL用于保存负数个数
    
LAST:CMP BYTE PTR [BX],100 
    JA NEXT;无符号数比较,如果X>Y转移
    INC BX
    DEC CX
    JMP  LAST 
  
 NEXT:
	INC BX 
	INC DX
	LOOP LAST
	
	mov cx,0;循环次数清零
 	MOV AX, DX
 	
 	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 ;商是0就下一个循环
	
DoPrt:
	pop dx      ;dx中保存的是每次除的结果
	xchg dh,dl  ;原dh保存商,原dl保存余数
	add dl,30h  ;dl中的数字是每次除后的商,将其表示成ascii
	mov ah,2 
	int 21h 
	loop DoPrt ;依次输出
	
CODES ENDS
END START


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值