ret
pchar endp code ends
end main
8. 以10进制形式显示内存中一有符号字节数据
例:var
db
0ffH
屏幕应显示:The result is: -1
data segment para
var str1 buf
db 7fh
db 0dh, 0ah, ‘The result is: ’ db 4 dup(‘ ’) db ‘$’
data ends
ss_seg segment stack
dw
100 dup(0)
ss_seg ends code segment para
assume cs:code, ds:data, ss:ss_seg main proc far
mov mov mov cmp jge mov neg
ax, data ds, ax buf, ‘+’ var, 0 next buf, ‘-‘ var al, var cx, 3 dl, 10
11
;判断var是正数,还是负数
;若var为负,则得到其相反数
next: mov
mov
mov
lea bx, buf+3 ah, 0 dl
; (AX / 10)商 ? al ; (AX / 10)余数? ah
main1: mov
div add mov dec
loop lea mov int mov int
ah, 30h [bx], ah bx main1 dx, str1 ah, 9 21h ax, 4c00h 21h
;循环3次,分别得到百、十、个位 ;显示10进制数
exit:
main endp
code ends
end main
9. 将一个16位的无符号数var, 转换为非压缩格式BCD码,存放在内存中buf
开始的单元中。(按高位在前、低位在后的顺序存放) data segment para
var buf
dw 800H db 5 dup(0)
data ends
ss_seg segment stack
dw
100 dup(0)
ss_seg ends code segment para
assume cs:code, ds:data, ss:ss_seg main proc far
mov mov
ax, data ds, ax
12
mov cx, 16 main1: shl var, 1
lea
bx, 4
push cx
mov
cx, 5 main2: mov al, buf[bx] adc al, al AAA
mov buf[bx], al dec bx loop main2
pop cx
loop main1
exit: mov ax, 4c00h
int
21h
main endp
code ends
end main
;((0*2 + B15)*2 + B14)*2 + … + )*2 + B0
;得到var的Bi位
;执行buf*2 + Bi操作
非压缩格式BCD码调整
;内循环为5次
;外循环为16次
13
选作题:
10. 内存中从str开始存放一字符串,结束符为NULL字符,请编写程序统计该
字符串中单词的个数 例:str1
db 0dh, 0ah, ‘Hello world, welcome to DUT. CPU is central
processing unit!’, 0h
统计’….’中的单词个数,结果为10
data
segment
para
str1 db 'long long ago, there lived a king, the king asked the artist to ’ db ‘draw a horse for him ',0
words dw 0
ends
stack
data
ss_seg segment
db 256 dup(?)
ss_seg ends code
segment
assume cs:code,ds:data,ss:ss_seg main
proc push xor push mov mov mov lea mov cld
far ds ax, ax ax
ax, data ds, ax cx, 0
;用cx存放单词数
si, str1
bl, ' '
;bl总保存当前字符的前一个字符
main_3: lodsb
and jz cmp jnz
al, al main_1
al, ' '
;比较是否是空格
;判断al是否为结束符0
main_2
bl, ' '
;比较前一个字符是否为空格,不是则此空格 ;不能算一个单词
14
main_4: cmp
jz cmp
main_5
bl, ','
;比较前一个字符是否为逗号,如果是则此空 ;格也不能算一个单词
jz inc
main_5 cx
;只有当前字符为' '或','而且前一个字符为有 ;效字符时,才对单词数加1
jmp main_5
al, ','
;比较是否是','号
main_2: cmp
jz
main_4
bl, al
;进入这里表明此时al中内容不是0,' ', ','三种 ;符号,保存al到bl
main_5: mov
jmp main_3
bl, ' '
;判断结束符前面是否为单词,还是为一个' '或','
main_1: cmp
jz cmp jz inc
main_6
bl, ','
main_6 cx
;若结束符前是一个有效字符,那么单词数应该加1
main_6: mov
ret endp
words, cx
main
code
ends
main
end
11 编写程序用键盘1~7键,模拟7个音符,进行键盘演奏!
注:需要对8253的定时器2和8255的PB口进行初始化
data
segment
para
Table_L dw 131,147,165,175,196,220,247,262 ;低音1-7的频率 Table_M dw 262,294,330,349,392,440,494,523 ;高音1-7的频率 shift_1 equ 21h shift_2 equ 40h shift_3 equ 23h shift_4 equ 24h shift_5 equ 25h shift_6 equ 5Eh shift_7 equ 26h
15