c语言,有符号数怎么汇编语言转换成c语言无符号数

1、使用记事本等编辑软件编写程序源代码并保存为asm文件。

2、使用DOSBOX软件搭建汇编环境调用masm和link程序,将源代码编译链接成可执行程序(maxmin.exe)如图

3、运行maxmin.exe,查看程序运行情況及结果检验
在DOS环境中运行debug maxmin.exe运用debug的u,gd,rt调用功能,即可查看检验程序运行状况
首先调用反汇编指令u查看每条代码的代码段偏移地址
找到已初始化完成语句MOV AX,SEG AREA,该语句对应的偏移地址为0005
再调用运行命令g,执行g5 并调用显示内存单元内容的命令D (d0)查看内存单元内容
绿框中为待处理10个无符号数100,3,654,54,898,3,125,对应的16进制存储单元,每4位16进制对应一个0~65535无符号数共20个存储单元。两红框中为表示最大值和最小值的变量MAX和MIN的存储单元预设值分别为65535和0,即16进制数FFFF和0000
再次调用反汇编指令u查看后续代码的代码段偏移地址,找到主程序已运行完毕的语句MOV AH,4CH该语句對应的偏移地址为0046
再调用运行命令g,执行g0046并调用显示内存单元内容的命令D (d46)查看内存单元内容
变量MAX中为十六进制数1A0A,刚好对应十个数Φ最大数6666
变量MIN中为十六进制数0003,刚好对应十个数中最小数3运行结果正确。

实验过程原始记录及计算结果(数据、表格、计算、曲线等)

在完成求取最小值程序编写后我尚未继续编写求取最大值程序,以便于检验最小值程序和整体框架的正确性经运行调试后,得到正確的求取最小值程序但之后我本打算将最小值程序稍作修改得到最大值程序,编写后进行调试发现如下错误结果
经检查发现是我在求取最小值程序后尚未将变址寄存器SI赋值回数组AREA的首地址,使得求取最大值程序发生错误改正方法:求取最大值程序前应重新初始化,将SI賦回数组AREA的首地址修改程序,加上 MOV SI,OFFSET AREA命令之后运行调试正确。

}

这两天的工作需要涉及到对无符匼数有符号数作混合运算。

作了一些实验发现自己写了这么多年的程序,以前对于符号数计算相关的理解居然仍存在一些盲点

有符號数与无符号数混合运算可能有三种混合方式

1。操作数全为有符号数 如:

情形1和2就不用说了因为运算中涉及的都是相同符号特征的操作數,计算过程中不会引起歧义

而对于情形3,由于涉及到了符号特性相异的操作数情况就有些复杂了。

这里先说一下对于有些运算操莋,是要区分有符号与无符号的情况的比如有符号的除法与无符号

的除法,有符号的取模运算与无符号的取模运算其计算语意是不同嘚,具体来说有符号的除法在x86

平台上对应的汇编指令是idiv,而无符号的除法对应的则是div

对于另外一些操作运算,则是不区分有符号与無符号的比如,加法减法,乘法运算

对于不同操作符与符号相关的情形可以通过下面的小程序来验证:


}
对这一段程序调用 g++ -S,生成相應的汇编文件就会发现:

加法运算,无论是有符号还是无符号对应的都是addl指令,

运算对应的都是subl指令, 运算对应的都是imul指令, 运算对应的是idiv指令无符号除法对应的则是 div指令,有符号数取模运算会用到idiv指令无符号取模用的则是div指令。 所以回到初始的问题情形1和2嘚行为是容易预期的,因为所有操作数都具有同样的符号特性直接就

可以得出采用相应符号特性的运算类型。

对于情形3因为涉及到不哃符号数的混合计算,在计算之前需要先对操作数进行规整化的动

作规整的原则就是如果操作数中存在至少一个无符号数,则所有操作數都被转化为无符号数

运算操作也采用相应的无符号操作符进行,计算完的结果也是一个无符号数

会采用无符号除法进行,其实质相當于

再进一步对于运算-2 / -1,如果采用有符号数运算结果是1,采用无符号数运算结果则是0

除法取模这样的操作符在不同的上下文语境里对应的语义动作也有所不同,而且这种差异还不

同于c++里的操作符重载在语言级别可见而是要到更底层的汇编语言级别才可见,这多尐就有

一些tricky也容易诱使程序员犯错了。如果有机会我来设计一门语言我想自己会尽量避免引

入这种tricky的东西的。

加载中请稍候......

}

我要回帖

更多关于 汇编语言转换成c语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信