Dividing and Conquering



  • Book: Assembly Language step by step

  • Complexity kills programs.

  • Remember to use comment headers.(Comment is very very important!)

More Than 25 lines and you're doing too much in one procedure.Split it up.

Calling and Returning


call LoadBuff
...
loadBuff:
push eax ; a1
push ebx ; a2
push edx ; a3
mov eax, 3 ; sys_read call
mov ebx, 0 ; File Descriptor 0: stdin
mov ecx, Buff ; offset of the buffer to read to
mov edx, BUFFLEN ; number of bytes to read at one pass
int 80h ; sys_read
mov ebp, eax
xor ecx, ecx
pop edx ; b1
pop ebx ; b2
pop eax ; b3
ret
  • a1~a3 and b1~b3 are store of stack
  • "xor ecx, ecx" is faster than "mov ecx, 0"

Saving the Caller's Registers


pushad
...
popad

Table Tricks


DumpLin db " 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "
DUMPLEN equ $-DumpLin
ASCLin db "|................|", 10
ASCLEN equ $-ASCLin
FULLLEN equ $-DumpLin

lea edi, [edx*2+edx] ; trick to calculate 3*edx

Local Labels and the Lengths of Jumps


Scan:
xor eax, eax
...
.modTest:
test esi, 0000000Fh
...
  • "Scan" is a nonlocal label.(global label)
  • ".modTest" is a local label.
  • Local labels are local to the first nonlocal label that precedes them in the code.
  • A local label cannot be referenced higher in the source code file than the global label that owns it.
  • Local labels are not accessible as breakpoints from the command-line interface of GDB.
  • Good habits: local labels and all jumps to them should occur within a single screen of code.

Type of Jumps

jne Scan ; Short jump, to within 127 bytes in either direction
jne near Scan ; Near jump, anywhere in the current code segment

Building External Procedure Libraries


  • Each executable file can only contain one _start: label. External modules do not contain _start:

  • External modules do not return to Linux.(Only the main program module can make sys_exit INT 80h call)

main-program.asm:

section .text
extern ClearLine
global _start
_start:
...
call ClearLine
...

lib.asm:

section .text
global ClearLine
...
ClearLine:
...

Rules:

  • "extern" to declare all the labels that don't belong to the current file.
  • "global" to declare all the labels in the current file needed by other files.

Simple Cursor Control in the Linux Console


[section .data]
PositionTerm db 27, "[01;01H"  ;  <ESC>[<Y>;<X>H  -This sequences move the cursor to (X, Y)
ClearTerm db 27, "[2J"  ;  <ESC>[2J    -This sequences clears the display.
GreenBack db 27, "[42m"  ; <ESC>[42m  -turns the consoles background green

For more details about console escape codes: man console_codes

Creating and Using Macros


%macro WriteStr 2 ; 2 arguments
    push eax
    push ebx
    mov ecx, %1 ; %1 invokes the first argument (Prompt)
    mov edx, %2 ; %2 invokes the second argument (PROMPTLEN)
    mov eax, 4
    mov edx, 1
    int 80h
    pop ebx
    pop eax
%endmacro
....
....
WriteStr Prompt, PROMPTLEN
; When a macro is invoked, its arguments are separated by commas.

Local Labels Within Macros

%macro UpCase 2
    mov edx, %1
    mov ecx, %2
%%IsLC:
    cmp byte [edx+ecx-1], 'a'
    jb %%Bump
    cmp byte [edx+ecx-1], 'z'
    ja %%Bump
    sub byte [edx+ecx-1], 20h
%%Bump:
    dec ecx
    jnz %%IsLC
%endmacro

Macro Libraries As Include Files

%include "mylib.mac"

LinuxAsm#Chapter10的更多相关文章

  1. 【Python编程:从入门到实践】chapter10 文件和异常

    chapter10 文件和异常 10.1 从文件中读取数据 10.1.1 读取整个文件 with open("pi.txt") as file_object: contents = ...

  2. 【Linux_Unix系统编程】Chapter10 时间

    chapter10 时间 1:真实时间:度量这一时间的起点有二:(1)某个标准点:(2)进程生命周期内的某个固定时点(通常为程序启动) 2:进程时间:一个进程所使用的CPU时间总量,适用于对程序,算法 ...

  3. Chapter10

    package scala import java.io.{PrintStream, PrintWriter}import java.util.Date import scala.util.loggi ...

  4. 【笔记】《Redis设计与实现》chapter10 RDB持久化

    chapter10 RDB持久化 10.1 RDB文件的创建和载入 有两个Redis命令可以用于生成RDB文件,SAVE和BGSAVE SAVE阻塞服务器进程进行RDB文件的创建,BGSAVE则创建服 ...

  5. JavaWeb chapter10 JavaWeb开发模式

    1.  开发模式 (1)开发模式1:JSP+JavaBean (2)开发模式2:Servlet+JSP+JavaBean (MVC) 2.JavaBean 本质上是一个普通的Java类:需要遵循一定的 ...

  6. Chapter10:泛型算法

    泛型算法的基础是迭代器. 迭代器令算法不依赖于容器,但是算法依赖于元素类型的操作.也即:算法永远不会执行容器的操作. 那么,如果想向容器中添加元素或者执行其他的一些操作呢?标准库提供了插入迭代器来完成 ...

  7. Chapter10(泛型算法)--C++Prime笔记

    关键:算法通过在迭代器上进行操作来实现类型无关.算法不改变所操作序列的大小. 1.算法大多都定义在algorithm头文件中,标准库还在头文件numeric中定义了一组数值泛型算法. 2.泛型算法永远 ...

  8. 【APUE】Chapter10 Signals

    Signal主要分两大部分: A. 什么是Signal,有哪些Signal,都是干什么使的. B. 列举了非常多不正确(不可靠)的处理Signal的方式,以及怎么样设计来避免这些错误出现. 10.2 ...

  9. [SharePoint][SharePoint Designer 入门经典]Chapter10 Web部件链接

    本章概要: 1.Web部件作用 2.如何添加和配置 3.如何个性化 4.如何导出,并在其他站点重利用 5.通过组合web part创建复杂的用户界面

随机推荐

  1. Infinite Scroll - jQuery & WP 无限滚动插件

    无限滚动(Infinite Scroll)也称为自动分页.滚动分页和无限分页.常用在图片.文章或其它列表形式的网页中,用来在滚动网页的时候自动加载下一页的内容.Infinite Scroll  这款  ...

  2. 类似 Dribbble 下载按钮的 SVG 弹性动画进度条

    Codrops 发布了一个如何创建一个基于弹性效果的 SVG 加载进度条教程,基于 SVG 和 TweenMax 实现.按钮开始的时候是一个带有箭头的图标,一旦它被点击,动画成一个有趣的小金属丝和一个 ...

  3. Gremlins.js – 模拟用户随机操作的 JS 测试库

    Gremlins.js 是基于 JavaScript 编写的 Monkey 测试库,支持 Node.js 平台和浏览器中使用.Gremlins.js 随机模拟用户操作:单击窗口中的任意位置,在表格中输 ...

  4. angular源码分析:angular的源代码目录结构说明

    一.读源码,是选择"编译合并后"的呢还是"编译前的"呢? 有朋友说,读angular源码,直接看编译后的,多好,不用管模块间的关系,从上往下读就好了.但是在我看 ...

  5. 带你秒学JavaScript

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理.是静态网页转变为动态的 ...

  6. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  7. 如何:对 SharePoint 列表项隐藏 ECB 中的菜单项

    可以通过使用功能框架向编辑控制块 (ECB) 菜单添加新的自定义操作.但是,您不能使用此方法进行相反的操作,即隐藏现有的 ECB 菜单项,因为它们是通过使用 ECMAScript(JavaScript ...

  8. Eclipse CDT Linux下内存分析 补记

    常用工具汇总 http://www.ibm.com/developerworks/cn/linux/l-cn-memleak/ 常用的内存分析工具 http://en.wikipedia.org/wi ...

  9. Spring Session

    开工开工, 准备条件: 1. 本地Redis,官网:http://redis.io/,windows下 https://github.com/ServiceStack/redis-windows ht ...

  10. Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数

    1.主要布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...