找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 55|回复: 0

第7章习题

[复制链接]

620

主题

336

回帖

1057

积分

管理员

积分
1057
发表于 2026-3-15 09:31:26 | 显示全部楼层 |阅读模式
第7章习题

1.在某程序中声明和初始化了以下的有符号数。请问,正数和负数各有多少?
data1 db 0x05,0xff,0x80,0xf0,0x97,0x30
data2 dw 0x90,0xfff0,0xa0,0x1235,0x2f,0xc0,0xc5bc

答:正数为0x05,0x30,0x90,0xa0,0x1235,0x2f,0xc0,一共7个;
负数为0xff,0x80,0xf0,0x97,0xfff0,0xc5bc,一共6个。

2.如果可能的话,尝试编写一个主引导扇区程序来做上面的工作。
参考答案(已上机验证过,可统计并在屏幕上打印正数和负数数量):
;统计指定数据中的负数个数
    mov ax, 0x7c0
    mov ds, ax

    ;统计字节数组 data1里的正负数数量
    mov si, data1
    mov cx, 6       ; 循环次数
.byte_loop:
    mov al, [si]
    add al, 0
    js .byte_neg
    inc word [unsign]
    jmp .byte_next
.byte_neg:
    inc word [sign]
.byte_next:
    inc si
    loop .byte_loop

    ;统计字数组 data2里的正负数数量
    mov si, data2
    mov cx, 7
.word_loop:
    mov ax, [si]
    add ax, 0
    js .word_neg
    inc word [unsign]
    jmp .word_next
.word_neg:
    inc word [sign]
.word_next:
    add si, 2
    loop .word_loop

    ;以下开始转换和显示正负数数量

    mov ax, 0xb800
    mov es, ax                    ;设置显示缓冲区
    xor di,di                     ;显示缓冲区内偏移地址

    ;计算正数数量的各个数位
    mov ax, [unsign]
    mov bx,number
    mov cx,5                      ;循环次数
    mov si,10                     ;除数
digit1:
    xor dx,dx
    div si
    mov [bx],dl                   ;保存数位
    inc bx
    loop digit1

    ;显示各个数位
    mov bx,number
    mov si,4
show1:
    mov al,[bx+si]
    add al,0x30
    mov ah,0x07
    mov [es:di],ax
    add di,2
    dec si
    jns show1

    mov word [es:di], 0x072c      ;显示分隔逗号
    add di,2

    ;计算负数数量的各个数位
    mov ax, [sign]
    mov bx,number
    mov cx,5                      ;循环次数
    mov si,10                     ;除数
digit2:
    xor dx,dx
    div si
    mov [bx],dl                   ;保存数位
    inc bx
    loop digit2

    ;显示各个数位
    mov bx,number
    mov si,4
show2:
    mov al,[bx+si]
    add al,0x30
    mov ah,0x07
    mov [es:di],ax
    add di,2
    dec si
    jns show2

    jmp $

data1 db 0x05, 0xff, 0x80, 0xf0, 0x97, 0x30
data2 dw 0x0090, 0xfff0, 0x00a0, 0x1235, 0x002f, 0x00c0, 0xc5bc
sign dw 0                        ;负数数量
unsign dw 0                      ;正数数量
number db 0, 0, 0, 0, 0          ;转换和显示所用的缓冲区

times 510-($-$$) db 0
                 dw 0xaa55

3.请问下面的循环将执行多少次:
         mov cx,0
delay: loop delay
答:实际就是loop指令执行次数。第1次执行使CX=0-1=0xFFFF。于是又执行0xFFFF次。总共65536次。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2026-3-30 18:18 , Processed in 0.225085 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表