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