汇编网首页登录博客注册
zy_sky的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  

[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自己能...
阅读全文 | 评论次数(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...
阅读全文 | 评论次数(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) | 浏览次数(521) | 所属类型(默认类型)

[2011-04-05 15:42] 关于标号

标号有两种形式,带冒号的标号和不带冒号的标号。
   带冒号的标号叫做指令标号,如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...
阅读全文 | 评论次数(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) | 浏览次数(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...
阅读全文 | 评论次数(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,
;安装完毕...
阅读全文 | 评论次数(0) | 浏览次数(550) | 所属类型(默认类型)