

[2011-04-16 13:26] 综合研究4 实现printf函数
根据综合研究5的showchar()函数,可以了解参数都是由栈传递的,所要传递参数的个数也可以由栈传递。那么printf函数要输出的参数肯定也是由栈传递。另外一点就是printf函数肯定有某种信息,这种信息记录了需要打印的个数。
main()
{
printf("%c,%d\n",'a',2);
}
函数如上,编译连接后用反汇编查看cs:01fa
能看出来,打印的参数‘a’,2都是由栈传递。入栈的时候还有一个未知信息:mov ax,0194
Push ax
0194肯定不是我们需要打印的参数,那么它就是printf函数自己添加的。根据上面的假设,printf自己能...
main()
{
printf("%c,%d\n",'a',2);
}
函数如上,编译连接后用反汇编查看cs:01fa
能看出来,打印的参数‘a’,2都是由栈传递。入栈的时候还有一个未知信息:mov ax,0194
Push ax
0194肯定不是我们需要打印的参数,那么它就是printf函数自己添加的。根据上面的假设,printf自己能...
阅读全文 |
评论次数(0) |
浏览次数(578) |
所属类型(默认类型)
[2011-04-13 16:50] 综合研究4
c语言忘掉的太多了,自己一边看综合一边记录点。
#define Buffer ((char *)*(int far*)(0x2000000))
main()
{
Buffer=(char *)malloc(20);
Buffer[10]=0;
while(Buffer[10]!=8)
{
Buffer[Buffer[10]]='a'+Buffer[10];
Buffer[10]++;
}
}
这个程序中,用到了宏定义和malloc。
c语言满足右结合原则。 宏定义*(int far*)(0...
#define Buffer ((char *)*(int far*)(0x2000000))
main()
{
Buffer=(char *)malloc(20);
Buffer[10]=0;
while(Buffer[10]!=8)
{
Buffer[Buffer[10]]='a'+Buffer[10];
Buffer[10]++;
}
}
这个程序中,用到了宏定义和malloc。
c语言满足右结合原则。 宏定义*(int far*)(0...
阅读全文 |
评论次数(0) |
浏览次数(547) |
所属类型(默认类型)
[2011-04-08 19:42] 关于课设2
课设2分析:
计算机从软盘启动的时候,会把0道0面1扇区的内容考到内存0:7c00h处。再将cs:ip指向0:7c00h。所以完成的目标程序需要先写到软盘上,再设置系统从软盘启动。
这样整个过程有两次程序复制,一次是将程序搬到软盘,一次是将程序从软盘搬到内存。
因为系统能够完成的是拷贝一个扇区的内容到内存0:7c00h处,并且把cs:ip指向0:7c00。但是我们的程序可能大于一个扇区,所以后面的程序我们自己将它搬过来。
(验证想法:既然需要考后几个扇区的内容到0:7c00h+512字节处,那么直接从第一个扇区开始拷,也就是第一个扇区再考一次,覆盖...
计算机从软盘启动的时候,会把0道0面1扇区的内容考到内存0:7c00h处。再将cs:ip指向0:7c00h。所以完成的目标程序需要先写到软盘上,再设置系统从软盘启动。
这样整个过程有两次程序复制,一次是将程序搬到软盘,一次是将程序从软盘搬到内存。
因为系统能够完成的是拷贝一个扇区的内容到内存0:7c00h处,并且把cs:ip指向0:7c00。但是我们的程序可能大于一个扇区,所以后面的程序我们自己将它搬过来。
(验证想法:既然需要考后几个扇区的内容到0:7c00h+512字节处,那么直接从第一个扇区开始拷,也就是第一个扇区再考一次,覆盖...
阅读全文 |
评论次数(0) |
浏览次数(521) |
所属类型(默认类型)
[2011-04-05 15:42] 关于标号
标号有两种形式,带冒号的标号和不带冒号的标号。
带冒号的标号叫做指令标号,如s:mov ax,4c00h.
不带冒号的标号叫做伪指令标号,如 str db "welcome to masm"
标号有三种属性:段属性,偏移属性,类型属性(也叫距离属性)
段属性:段属性定义了标号所在段的段起始地址,这个值放在段寄存器中。
偏移属性:偏移属性记录了标号相对于段起始地址的偏移量。
类型属性:也叫距离属性。指标号和转移指令的距离。标号在段内使用时,距离在-128~127之间时,距离属性为short。距离在-32768~32767之间时,距离属性为near...
带冒号的标号叫做指令标号,如s:mov ax,4c00h.
不带冒号的标号叫做伪指令标号,如 str db "welcome to masm"
标号有三种属性:段属性,偏移属性,类型属性(也叫距离属性)
段属性:段属性定义了标号所在段的段起始地址,这个值放在段寄存器中。
偏移属性:偏移属性记录了标号相对于段起始地址的偏移量。
类型属性:也叫距离属性。指标号和转移指令的距离。标号在段内使用时,距离在-128~127之间时,距离属性为short。距离在-32768~32767之间时,距离属性为near...
阅读全文 |
评论次数(0) |
浏览次数(543) |
所属类型(默认类型)
[2011-04-02 10:41] 第十六章实验
在代码段中,子程序相当于高级语言中的函数,子程序名称就是一个地址。可以分别得到它的段地址和偏移地址。程序在编译的时候,编译器就为子程序的名称分配了偏移地址。这个偏移地址就是它相对于代码段起始位置的偏移。
使用直接定址表记录多个子程序的入口地址的时候,这些地址是相对于当前代码段的偏移。如果把它们拷到其它内存,那么这些子程序的实际地址就变了。但是编译器给标号的地址是不变的。
那么十六章实验写成这样:
assume cs:code
code segment
start: mov ax,offset table ;取得标号的偏移地址 003bh
m...
使用直接定址表记录多个子程序的入口地址的时候,这些地址是相对于当前代码段的偏移。如果把它们拷到其它内存,那么这些子程序的实际地址就变了。但是编译器给标号的地址是不变的。
那么十六章实验写成这样:
assume cs:code
code segment
start: mov ax,offset table ;取得标号的偏移地址 003bh
m...
阅读全文 |
评论次数(0) |
浏览次数(515) |
所属类型(默认类型)
[2011-03-29 10:41] 关于div引发的除法溢出中断 与iret能否正确返回的问题
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=7740&kindId=10825&postId=13854&readSg=1
具体问题在上面的地址中已经讲的很清楚了。
我的程序一开始是这样的:
安装0号中断,设置引发中断时显示overflow!字符串
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset int0
mov...
具体问题在上面的地址中已经讲的很清楚了。
我的程序一开始是这样的:
安装0号中断,设置引发中断时显示overflow!字符串
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset int0
mov...
阅读全文 |
评论次数(0) |
浏览次数(716) |
所属类型(默认类型)
[2010-11-18 11:06] 关于11章加减法对cf位的影响
关于计算机内的加减法运算,按照补码加法运算和在debug中运算,进位的影响不同的问题。
问题如下: 直接按照补码运算 [8]补+[-3]补
进行运算8-3=[8]补+[-3]补
0000 1000
+ 1111 1101
--------------------
1 0000 0101
可见有进位,但在debug中运行时,cf标志位显示0
问题解决如下:
1)无符号运算影响cf标志位
2)inc dec指令对cf标志位没有影响
3) 不管是加法还是减法,计算机内部都是进行两个补码的加法操作。
对于cf...
问题如下: 直接按照补码运算 [8]补+[-3]补
进行运算8-3=[8]补+[-3]补
0000 1000
+ 1111 1101
--------------------
1 0000 0101
可见有进位,但在debug中运行时,cf标志位显示0
问题解决如下:
1)无符号运算影响cf标志位
2)inc dec指令对cf标志位没有影响
3) 不管是加法还是减法,计算机内部都是进行两个补码的加法操作。
对于cf...
阅读全文 |
评论次数(0) |
浏览次数(788) |
所属类型(默认类型)
[2010-11-11 15:35] 关于16.4的程序
;注意:程序写完后,各个段标号有了自己的偏移地址,他们的这个地址都是相对于程序
;起始位置(cs:0000) 偏移,安装中断后,这些程序所在的内存已经改变,但这些段标;号没改变。如何又能应用数据标号寻址(table[bx])又能找到正确的程序入口?
;关于所安装的中断内容,把它放在程序的一开始,table ,sub1,sub2,sub3,sub4这些标;号的地址都是相对起始地址的偏移,也就是偏移地址从0开始计算的。
;所以在这里数据标号table的偏移地址应该是0002h.
;
;把这段程序装在0:200h内存处,这个地址的另一种表示方法为0020:0000h,
;安装完毕...
;起始位置(cs:0000) 偏移,安装中断后,这些程序所在的内存已经改变,但这些段标;号没改变。如何又能应用数据标号寻址(table[bx])又能找到正确的程序入口?
;关于所安装的中断内容,把它放在程序的一开始,table ,sub1,sub2,sub3,sub4这些标;号的地址都是相对起始地址的偏移,也就是偏移地址从0开始计算的。
;所以在这里数据标号table的偏移地址应该是0002h.
;
;把这段程序装在0:200h内存处,这个地址的另一种表示方法为0020:0000h,
;安装完毕...
阅读全文 |
评论次数(0) |
浏览次数(550) |
所属类型(默认类型)