当前位置: 代码迷 >> 汇编语言 >> 王爽编译语言直接定址表书上程序有一条没搞懂
  详细解决方案

王爽编译语言直接定址表书上程序有一条没搞懂

热度:229   发布时间:2016-05-02 04:35:55.0
王爽汇编语言直接定址表书上程序有一条没搞懂
编写一个子程序,计算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告诉它
  相关解决方案