《x86汇编语言:从实模式到保护模式》第六章:本章习题

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次。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值