• 汇编练习题(1)


        一直认为写代码是学习编程语言的最好方式。 但是因为汇编并不适合用来做大型的项目。所以这里找了100个c++的练习题用来学习汇编。 
        这里想想一个一个练习写下去,然后贴出来,和大家分享学习下。 
        本文所用到的ide为RadAsm, 所以汇编为win32汇编。helloword 见利用RadASM 写汇编程序  
    习题1:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 
    写成c代码很简单: 

    void p1_fun() 
    { 
        for (int i = 1; i <= 4; ++i){ 
            for (int j = 1; j <= 4; ++j){ 
                for (int k = 1; k <=4; ++k){ 
                    if (i !=j && i !=k && j != k){ 
                        ostringstream stringStream; 
                        stringStream<<i<<j<<k; 
                        cout<<stringStream.str()<<","; 
                    } 
                } 
            } 
        } 
    }
    

      用汇编实现如下

    Title: Hello world 
     ;Author: sld6666666@gmail.com    
     ;Data: 2012-11-29 
     ;Description: Assemble hello world
     .386                ;¸Ã³ÌÐò¶ÔCPUµÄ×îµÍÒªÇóÊÇintel 386 
     .model flat, stdcall        ; ƽ̹ÄÚ´æÄ£ÐÍ£¬ stacll º¯Êýµ÷Ó÷½Ê½ 
     .stack 4096            ;Õ»µÄ´óСΪ4096B
     option casemap:none
     
     ;include Í·Îļþ£¬ Á¬½Ó¿â 
    
    include msvcrt.inc
    includelib msvcrt.lib
     
     .data                    ;Êý¾Ý¶Î
         index_0 dd  dword
         index_1 dd  dword
         index_2 dd  dword
         szFmt db '%d%d%d', 0
         entryFmt db '  ',0
     
     .code
         start:
         	mov	index_0, 0
         
         	forProcess_0:
         		cmp	index_0, 5
         		jge	rtnProcess	
         		inc	index_0	
         		mov	index_1, 0
         		
         		forProcess_1:
         			cmp index_1, 5
         			jge	forProcess_0
         			inc index_1
         			mov	index_2, 0
         			
         			forProcess_2:
         				cmp index_2, 5
         				jge forProcess_1
         				inc index_2
         				
         				mov eax, index_0
         				mov ebx, index_1
         				mov edx, index_2
         				
         				cmp eax, ebx
         				je forProcess_2
         				
         				cmp eax, edx
         				je forProcess_2
         				
         				cmp ebx, edx
         				je forProcess_2
         				
         				invoke crt_printf, addr szFmt,eax, ebx, edx
         				invoke crt_printf, addr entryFmt
         				jmp forProcess_2
    
            rtnProcess:
             	ret
         
         end start
    

      解释下几个关键点: 
    1. 输出函数利用了 msvcrt 中的printf 
    2. 导入库的关键字为includelib, 头文件的关键字为 include, 如include msvcrt.inc,includelib msvcrt.lib 
    3. 使用导入函数的关键字为 invoke  
        运行结果如下:

     

  • 相关阅读:
    搜房二手频道调研
    智能评论排序
    国外社交网站调研(13年9月)
    百度金融产品的几点看法
    Microvideos for Website/ products
    C#后端代码访问webapi
    基于FineUI-FineUIMVC基础版开发的通用后台框架
    EasyUI, Dialog 在框架页(ifrmae)的Top页面弹出时,拖拽Dialog边缘(以改变窗口大小),UI界面被卡死的解决办法
    在Windows上使用Docker 创建MongoDB 副本集的极简方法(翻译)
    初探ABP--记一些常见的开发问题
  • 原文地址:https://www.cnblogs.com/sld666666/p/2796650.html
Copyright © 2020-2023  润新知