. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  16.3节的  用AL传送要显示的数据,这个子程序看不懂,有哪位高手能把每行代码解释一下  [待解决] 回复[ 9次 ]   点击[ 718次 ]  
ycxdtdz
[帖 主]   [ 发表时间:2014-02-13 15:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-12-11 10:36
16.3节的  用AL传送要显示的数据,这个子程序看不懂,有哪位高手能把每行代码解释一下
hky987654321
[第1楼]   [ 回复时间:2014-02-13 17:42 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
可能不需要解释每行代码,理清思路、弄懂关键步骤就行。

    1、一个字节要用两个16进制数表示,分别是高4位和低4位,如一字节可表示的最大数FF 。

    2、将字节的高4位、低4位分成两个独立的16进制数(右移4位和and运算)。注意此时得到的是16进制数。

    3、在table中“顺序设置”16进制数的ASCII码(用单引号括起来),这时table中的每个ASCII码值的偏移地址就是该16进制数本身(完成对应关系的构建),即0——>'0'、A——>'A'、F——>'F'等。

    4、利用上述对应关系,从table中分别取出高4位、低4位16进制数的ASCII码,并在es中显示。
 
    一句话,用数字自身作地址,去取出数字对应的ASCII码值。
hky987654321
[第2楼]   [ 回复时间:2014-02-13 17:45 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
可能不需要解释每行代码,理清思路、弄懂关键步骤就行。

    1、一个字节要用两个16进制数表示,分别是高4位和低4位,如一字节可表示的最大数FF 。

    2、将字节的高4位、低4位分成两个独立的16进制数(右移4位和and运算)。注意此时得到的是16进制数。

    3、在table中“顺序设置”16进制数的ASCII码(用单引号括起来),这时table中的每个ASCII码值的偏移地址就是该16进制数本身(完成对应关系的构建),即0 —> '0' 、A —> 'A' 、F —> 'F'等。

    4、利用上述对应关系,从table中分别取出高4位、低4位16进制数的ASCII码,并在es中显示。
 
    一句话,用数字自身作地址,去取出数字对应的ASCII码值。
ycxdtdz
[第3楼]   [ 回复时间:2014-02-14 08:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-12-11 10:36
谢谢你的解释,不过我还是有好多地方没弄懂,比如AX为什么不用赋值,还有MOV  ES:[160*12+40*2],这行代码只能显示1个字节,怎么能显示全部的字符表。
hky987654321
[第4楼]   [ 回复时间:2014-02-14 17:54 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
一、举例来说,当前主程序传入的入口参数为(AL)=BF(为直观,不写16进制后缀H,下同),
子程序只需对(AL)=BF进行:

         1、AH=AL             ;分存,使B和F通过后面的操作得以分开存放
        2、SHR AH,1          ; 右移,这步重复4次后得到(AH)=0B这个高4位的字节形式
         3、AND AL,00001111B  ; 使(AL)=0F,低4位的字节形式

      至此,BF —> 0B和0F
      查看table可知,这两个数正好是table中'B'和'F'的8位偏移地址值,
       因此对AH=0B进行如下操作,

         4、MOV BL,AH          ;转存8位地址,因为BX是寻址寄存器,而AX不是寻址寄存器
         5、MOV BH,0          ;置0,这样BX中就得到'B'的16位偏移地址值000B
        6、MOV AH,table[BX]  ;用这个地址就从table取出了'B',并存于AH中
      
      接下来在ES中显示这个'B'

        7、MOV ES:[160*12+40*2],AH ;这样就把ASCII码'B'送到ES中相应位置去显示了;

      接着再对AL=0F地进行4~7的类似操作,把'F'紧接着显示在'B'后面,(AL)=BF就全部显示在屏幕上了。

二、对于你新提的问题。
       1、(AL)就是主程序传递数据的入口参数,其赋值是在主程序中完成,你现在要编的是子程序,你不必考虑入口参数如AX等的赋值问题。
       2、AL只传入了一个字节,分存AH后,通过右移4位和and运算得到两个16进制数,这两个数才是需要在ES中显示的(AL)的字符形式,并不是输入这么一个参数后就显示全部16进制字符表table中的所有字符。你的这个问题不不符合该子程序的任务,再好好理解一下它的任务。
ycxdtdz
[第5楼]   [ 回复时间:2014-02-17 10:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-12-11 10:36
衷心的谢谢hky987654321 ,如果没有你的帮助,我真想放弃学汇编了。
flyier
[第6楼]   [ 回复时间:2017-09-11 14:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2017-09-02 17:09
真没看懂你说什么。。
flyier
[第7楼]   [ 回复时间:2017-09-11 15:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2017-09-02 17:09
回复:[第5楼]
------------------
你的废话可真多
qianxi
[第8楼]   [ 回复时间:2018-01-03 12:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2018-01-03 12:40
如果前面的真懂了,后面的不可能不懂!
jiao
[第9楼]   [ 回复时间:2023-11-01 14:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2023-09-13 14:04
你真刻薄啊,他明明在感谢人家的帮助,你还说人家废话多,希望没有人会帮助你。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved