首页
社区
课程
招聘
[旧帖] [求助]再请教一个汇编问题 0.00雪花
发表于: 2010-7-13 15:19 1453

[旧帖] [求助]再请教一个汇编问题 0.00雪花

2010-7-13 15:19
1453
例7.3 按五位十进制的形式显示寄存器BX中的内容,如果BX的值小于0,则应在显示数值之前显示负号'-'。

例如:(BX)=123,显示:00123;(BX)=-234,显示:-00234;

解:
;子程序功能:把寄存器BX的内容按十进制有符号数显示出来
;入口参数:BX
;出口参数:无,只有显示信息
;算法描述: 1、定义6个字节的存储单元
2、先判断BX是否小于零,如果是,则先显示负号'-',再取BX的绝对值;
3、采用除10,得余数的方法,从低位向高位求出每位十进制位;
4、输出数据的字符串。
SubData SEGMENT
DB
  5 DUP('0'), 0ah, 0dh, '$'    ;0ah、0dh:换行、回车
SubData ENDS
DISPBX PROC
ASSUME DS:SubData
PUSH DS
PUSH DX
PUSH CX
PUSH AX
MOV AX, SubData ;取子程序所用的数据区段地址
MOV DS, AX
CMP BX, 0
JGE next
MOV DL, '-'
MOV AH, 2
INT 21H ;显示负号'-'      
///这里是先显示了负号,再处理要显示的数字,刚看到题时,我以为要一下同时显示全部的,有点不大好理解,就是因为处理器速度够快?那样的话,哪些可以这样分开,哪些要同时处理呢?
NEG BX ;求-BX,使其值为正数
next: MOV SI, 4
MOV AX, BX
MOV CX, 10D
again: XOR DX, DX
IDIV CX ;DX存放余数,AX存放商
ADD DL, '0'
ADD这一句功能是不是使DL内容可显示?不过我还是不理解,为什么加上‘0’后就成了可显示的呢?比如30H 对应为数字“0”,为啥30H加上‘0’就变成可显的呢?
MOV [SI], DL
DEC SI
上两句不懂:(与上面的对si赋值4也不懂,[si]又是啥?
JGE again
XOR DX, DX
MOV AH, 9
INT 21H ;调用中断21的功能9,显示DS:DX指向的字符串
POP AX
POP CX
POP DX
POP DS
RET
DISPBX ENDP

谢谢热心人士的解答!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 780
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
1。
SubData SEGMENT
DB
  5 DUP('0'), 0ah, 0dh, '$'    ;0ah、0dh:换行、回车
SubData ENDS

相当于定义了一个数组:SubData[]={'0','0','0','0','0',0ah,0dh,'$'}

2.
MOV AX, SubData ;取子程序所用的数据区段地址
MOV DS, AX
则DS指向了SubData,相当于DS=SubData,则DS[0]='0',...,DS[4]='0',DS[5]=0X0A,DS[6]=0X0D,

3.
MOV [SI], DL
相当于:MOV DS:[SI], DL
即:DS[SI]=DL

结合
next: MOV SI, 4
DEC SI
两句话来看,第一句赋值4给SI,则MOV [SI],DL 第一次执行时即:DS[4]=DL,
即把BX的个位数的ASCII码赋给SubData[4],然后SI递减,将BX的十位赋给SubData[3],
BX的百位赋给SubData[2]...

4。
字符'0'的ascii为0x30,'1'的为0x31,'2'的为0x32....
那么一个数a(a为0~9)的ascii码就等于a+0x30,等同于a+'0'

5.
负号先输出的意义是:把符号的显示和数的显示分开处理,类似于模块化.
2010-7-13 15:55
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=RogerWood;835268]1。
SubData SEGMENT
DB
  5 DUP('0'), 0ah, 0dh, '$'    ;0ah、0dh:换行、回车
SubData ENDS

相当于定义了一个数组:SubData[]={'0','0','0','0','0',0ah,0dh,'$'}

2...[/QUOTE]

十分感谢RogerWood热心地解答!
不过那句+‘0’我还不理解,如果那个数组里的数字都不是+‘0’而直接显示,
会显示什么?
2010-7-13 23:30
0
雪    币: 780
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
要把字符显示出来,需要把字符的ascii码作为参数传给中断程序.
比如要显示字符'0',需要把'0'的ascii码0x30传给中断程序,要显示'a'则传0x61,等等.
+'0'不是+0,其实是+0x30,这样就可以把数字0~9转换为相应的ascii码.

如果直接显示的话,就显示ascii表里定义的对应字符:
Bin Dec Hex 缩写/字符 解释
00000000 0 00  NUL(null) 空字符  
00000001 1 01 SOH(start of headling) 标题开始
00000010 2 02 STX (start of text) 正文开始
00000011 3 03 ETX (end of text) 正文结束
00000100 4 04 EOT (end of transmission) 传输结束
00000101 5 05 ENQ (enquiry) 请求
00000110 6 06 ACK (acknowledge) 收到通知
00000111 7 07 BEL (bell) 响铃
00001000 8 08 BS (backspace) 退格
00001001 9  09 HT (horizontal tab) 水平制表符
00001010 10  0A  LF (NL line feed, new line) 换行键
00001011 11  0B  VT (vertical tab) 垂直制表符  
00001100 12  0C  FF (NP form feed, new page) 换页键
00001101 13 0D  CR (carriage return)  回车键
00001110 14 0E  SO (shift out) 不用切换
00001111 15 0F  SI (shift in) 启用切换
......
2010-7-14 08:50
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢你吖!难得有这么热心的人哪。
弱弱地问一句,不要告诉我那个列表你能背住吖?
2010-7-14 22:16
0
雪    币: 780
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
晕,那个列表是百度百科里抠的
2010-7-15 08:37
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
辛苦你啦!哈哈。
2010-7-15 12:43
0
游客
登录 | 注册 方可回帖
返回
//