假设数据段从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