nasm中use32和use16的使用方法,不知道怎么是这样的结果,请帮忙解答,谢谢

myxd 2008-05-02 06:38:58
segment a use32
..start:
mov ax,4c00h
mov eax,4c00h
int 21h
编译成exe在反编译过来如下:
2911:0000 66B8004CB800 MOV EAX,00B84C00h
2911:0006 4C DEC SP
2911:0007 0000 ADD [BX+SI],AL
2911:0009 CD21 INT 21h

segment a use16
..start:
mov ax,4c00h
mov eax,4c00h
int 21h
编译成exe在反编译过来如下:
2911:0000 B8004C MOV AX,4C00h
2911:0003 66B8004C0000 MOV EAX,00004C00h
2911:0009 CD21 INT 21h

从上面的结果来看,使用USE32的有问题,而使用USE16确实正常的。
我就不明白了,USE32怎么使用?

编译汇编的指令
nasm -f obj d.asm
alink d
...全文
388 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
myxd 2008-05-08
  • 打赏
  • 举报
回复
结贴先,做人要守信
cnzdgs 2008-05-05
  • 打赏
  • 举报
回复
仔细多看几遍书,保护模式的概念不好理解。通常情况下是根据USE16、USE32来判断,但如果严格讲起来,要根据程序的执行情况来看。CPU复位后是运行在实模式,是16位程序,设置CR0可以切换到保护模式,刚切入保护模式时也是16位程序,之后当遇到段间跳转、段间调用、中断或异常、任务切换等情况时可能使代码段发生改变,根据代码段的描述符来确定是16位还是32位。
myxd 2008-05-05
  • 打赏
  • 举报
回复
小弟愚笨,还是不太懂大哥的意思。
没有用汇编编写过windows下的程序,写的程序都是在dos窗口下的,也就没注意什么16位,32位的区别,现在要区分了,还真区分不出来。
谢谢cnzdgs这几天耐心解答。明天我就连上次的提问一起结贴。
再次道一声谢谢。
myxd 2008-05-05
  • 打赏
  • 举报
回复
上班的时候不能上网,只有晚上回来回复帖子,请cnzdgs多多包涵
myxd 2008-05-05
  • 打赏
  • 举报
回复
越来越糊涂。
到底何为16位程序、32位程序?
16位程序可以使用32位寄存器和地址;32位程序可以使用16位寄存器和地址,问题又回到我的第一个贴来了。
实模式可以使用32位寄存器、地址和16位寄存器和地址;保护模式也可以使用32位寄存器、地址和16位寄存器和地址。那我如何知道这个程序是16位程序还是32位程序呢?

如果我要把一个winxp下的应用程序(UltraEdit)反编译成汇编代码,应为如何做呢?

目前我就在学习从实模式和保护模式切换的知识,感觉调试非常困难,cnzdgs大虾有没有好的学习建议?

比较乱,不知道说明白我的意思没有
myxd 2008-05-04
  • 打赏
  • 举报
回复
在下面的例子中,使用USE16的段中既有16位的代码,又有32位代码。用debug32和cv都可以正常反编译过来,
我的问题是:
1、通过下面的例子,是否可以理解成debug32和cv可以反编译32位的代码呢?
2、如果问题1正确的话,那么他们也应该正确反编译USE32段中的代码,但得到的结果却是错误的,为什么呢?
3、如果问题1错误的话,那为什么在USE16段中能正确反编译32位代码呢?
4、应该使用什么反编译32位代码呢?

例子:
segment a use16
..start:
mov ax,4c00h
mov eax,4c00h
int 21h
编译成exe在反编译过来如下:
2911:0000 B8004C MOV AX,4C00h
2911:0003 66B8004C0000 MOV EAX,00004C00h
2911:0009 CD21 INT 21h

我理解的16位代码和32位代码是通过看他们是否使用了32位的寄存器或使用了32位地址来区别的。
cnzdgs 2008-05-04
  • 打赏
  • 举报
回复
这个例子只能说明它们可以反汇编16位代码,debug32我没用过,我用过的cv是调试DOS程序的,所以不确定它们能否反汇编32位代码。
有一点要提一下,对于一个保护模式程序,通常的调试或者反汇编工具无法判断出哪里是16位段,哪里是32位段,只有真正运行到某个段中的代码时才能知道,而通常的调试工具是不能调试保护模式程序的,它们通常只能支持16位或32位中的一种,假设你使用只支持16位程序的工具来反汇编,则不管是什么程序都会被当作16位程序来看。
前面我已经举例说了,同样的机器码在16位与32位段中执行其含义是不同的,从机器码上无法判断是16位还是32位,16位代码可以使用32位寄存器(指令加66H前缀),也可以32位地址(指令前加67H前缀),同样32位代码也可以使用16位寄存器(指令前加66H前缀),也可以使用16位地址(指令前加67H前缀)。
cnzdgs 2008-05-02
  • 打赏
  • 举报
回复
例如:B8 00 00 90 90
当作16位代码来看是:
mov ax, 0000H
nop
nop
当作32位代码来看是:
mov eax, 90900000H
cnzdgs 2008-05-02
  • 打赏
  • 举报
回复
USE32表示该段为32位段,段中所有代码都默认使用32位操作数和32位偏移量。用16位方式反汇编32位代码就会显示不对。

21,459

社区成员

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

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