1.请问,正数和负数各有多少?
data1: db 0x05,0xff,0x80,0xf0,0x97,0x30
data2: dw 0x90,0xfff0,0xa0,0x1235,0x2f,0xc0,0xc5bc
答案:
data1:正数2个,负数4个
data2:正数5个,负数2个
2.尝试写一个主引导扇区程序完成上面工作
代码如下:
jmp near start ;跳过以下数据区域
mytext1:db 'd',0x07,'a',0x07,'t',0x07,'a',0x07,'1',0x07,':',0x07
mytext2:db 'd',0x07,'a',0x07,'t',0x07,'a',0x07,'2',0x07,':',0x07
data1: db 0x05,0xff,0x80,0xf0,0x97,0x30
data2: dw 0x90,0xfff0,0xa0,0x1235,0x2f,0xc0,0xc5bc
start: ;真正代码从此运行
mov ax,0x07c0
mov ds,ax ;将段寄存器设置为0x07c0,如此,段内偏移地址=汇编地址
mov ax,0xb800
mov es,ax
xor di,di ;es:di->显存
mov si,mytext1 ;ds:si->'data1:'
mov cx,(mytext2-mytext1);(cx)='data1:'中字符个数
rep movsb ;将(ds:si)写入(es:di),即打印'data1:'
mov cx,(data2-data1) ;(cx)=data1中数据个数
xor dl,dl
mov dh,0x07 ;(dh)=字符属性,(dl)=数据中负数的个数,注意顺序!
xor bx,bx ;bx->data1中的每个数据
s1: mov al,[ds:data1+bx]
inc bx ;bx->下一个数据
cmp al,0 ;将数据与0比较
jnl l1 ;若数据不小于0,则继续循环
inc dl ;否则(数据为负),++(dl)
l1: loop s1
add dl,0x30 ;将dl中存储的负数个数变为字符
mov [es:di],dx ;写入显存
mov di,160
mov si,mytext2
mov cx,(data1-mytext2)
rep movsb
mov cx,(start-data2)/2
xor dl,dl
xor bx,bx
s2: mov ax,[ds:data2+bx]
add bx,2
cmp ax,0
jnl l2
inc dl
l2: loop s2
add dl,0x30
mov [es:di],dx
jmp $
times 510-($-$$) db 0
db 0x55,0xaa
运行截图:
这里只打印了数据中负数的个数,忘了打印正数个数了。。。。。。不想改了
3.请问下面的循环执行次数?
mov cx,0
delay: loop delay
答案:0x10000次
解析:loop指令执行两步操作:1.(cx)=(cx)-1;2.判断(cx)是否为0。所以,第一次执行loop delay时:1.(cx)=(cx)-1=0-1=0xffff;2.(cx)!=0。之后delay将继续执行0xffff次,共计0x10000次。