编写一个子程序,计算sin(x) , x属于(0 30 60 90 120 150 180 )
程序代码如下:
showsin:jmp short show
table dw ag0,ag30,ag60,ag90,ag120,ag150,ag180
ag0 db '0',0
ag30 db '0.5',0
ag60 db '0.866',0
ag90 db '1',0
ag120 db '0.866',0
ag150 db '0.5',0
ag180 db '0',0
show:
push bx
push es
push si
mov bx,0b800h
mov es,bx
;以下用角度值/30作为相对于table的偏移,取得对应的字符串的偏移地址,放在bx中
mov ah,0
mov bl,30
div bl
mov bl,al
mov bh,0 ;
add bx,bx ;这一条弄不懂 直接地址的话我的理解是与C中的数组相似 table[0]就是第一个元素,table[1]就是第二个元素
mov bx,table[bx];为什么还要add bx,bx一边呢??
以下显示相应的字符串
mov si,160*12+40*2
shows:
mov ah,cs:[bx]
cmp ah,0
je showret
mov es:[si],ah
inc bx
add si,2
jmp short shows
showret:
pop si
pop es
pop bx
ret
------解决方案--------------------
这个,很简单的吧,因为 table 是 dw 类型的,一个单元占用 2 字节,而 汇编里是不会给你计算元素大小以调节偏移的,这个需要自己算,所以得给下标乘以 2 得到相应的数组内的偏移。
------解决方案--------------------
你都说了只是代表单位长度了那这也可以是0地址字单元1地址字单元等等啊,bx的值如果不正确那么查表找到的字单元的内容自然也就不是你想要的了,table只代表一个字但是它无法明确这个字的起始地址是多少还是得bx告诉它