关于.RADIX伪指令的问题

Intel0011 2017-05-27 10:03:08
先上理论
.RADIX可以把默认的基数改变为2~16范围内的任何基数。其格式如下:
.RADIX 基数值 ;其中基数值用十进制数来表示

例如:
MOV   BX, 0FFH    ;16进制数标记为H
MOV   BL, 10000101B ;二进制数标记为B
MOV   BX, 178     ;10进制为默认的基数,可无标记

.RADIX 16       ;以下程序默认16进制数
MOV   BX, 0FF     ;16进制为默认的基数,可无标记
MOV   BX, 178D    ;10进制数应加标记D

应当注意,在用.RADIX 16把基数定为十六进制后,十进制数后面都应跟字母D。
在这种情况下,如果某个十六进制数的末字符为D,则应在其后跟字母H,以免与十进制数发生混淆。

再上代码验证
	.386
.model flat, stdcall
option casemap :none

include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include masm32.inc
includelib masm32.lib

.data
buffer db 100 dup(0)
szFmt db 'x = %x', 0ah, 0dh, 0

.radix 16 ;改变基数
x dd 100D

.code
start:
invoke wsprintf, ;格式化信息串
addr buffer, ;信息串格式化后的存放地
addr szFmt, ;信息串的格式
x

invoke StdOut,addr buffer ;显示串
invoke ExitProcess, 0 ;结束进程
end start

但ml 6.14下结果为
x = 100d
理论上应该为
x = 64

请问 .radix 16下如何写十进制数
实际上
.radix 16
MOV   BL, 10000101B
也会出问题

...全文
1205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Intel0011 2017-10-27
  • 打赏
  • 举报
回复
十分感谢DelphiGuy大神和zara大神 根据提示我在masm32的帮助中找到了相关信息 之前是在网上搜,但现在看,网上的信息部分是错误的,因为B和D是合法的16进制数,在.RADIX 16下根本无法用其限定2进制和10进制 比如 应当注意,在用.RADIX 16把基数定为十六进制后,十进制数后面都应跟字母D。 在这种情况下,如果某个十六进制数的末字符为D,则应在其后跟字母H,以免与十进制数发生混淆。
zara 2017-10-09
  • 打赏
  • 举报
回复
帮助里有说明啊,这样子需要用 T 来说明是十进制而非 D ,二进制用 Y 而非 B ,除非是小于等于 10 的默认进制。
Areslee 2017-10-09
  • 打赏
  • 举报
回复
晕,我前面看错了 这个100D被自动识别为16进制的“100D”=4109了
  • 打赏
  • 举报
回复
.radix 16 x dd 100t
Areslee 2017-10-01
  • 打赏
  • 举报
回复
另外你要求输出的是16进制“%x”。。。。 你定义任何东西都会是输出成16进制
Areslee 2017-08-06
  • 打赏
  • 举报
回复
非unicode环境下你怎么用wsprintf?不是应该用sprintf么

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧