1. 程式人生 > >32位組合語言學習筆記(32)--loop指令

32位組合語言學習筆記(32)--loop指令



loop指令用ecx來控制迴圈次數,loop label,相當於如下兩條指令:
dec ecx
jne label
如下是使用loop指令的一個示例程式:

section .data

	EditBuff: db 'abcdefghijklm',10
	BUFFERLEN equ $-EditBuff
	FILLCHR	  equ 35 ;'#'
	
section .text

WriteStr:
	push eax		; Save pertinent registers
	push ebx
	mov eax,4		; Specify sys_write call
	mov ebx,1		; Specify File Descriptor 1: Stdout
	int 80H			; Make the kernel call
	pop ebx			; Restore pertinent registers
	pop eax
	ret			; Go home
	
	global	_start
_start:
	nop
	
	mov ecx,EditBuff		
	mov edx,BUFFERLEN	
	call WriteStr
	
	mov edi,EditBuff
	mov ecx,BUFFERLEN-1
	mov al,FILLCHR
DoChar: stosb	; Note that there's no REP prefix!
	loop DoChar	; Go back & do another char until ECX goes to 0
				
	mov ecx,EditBuff		
	mov edx,BUFFERLEN	
	call WriteStr

Exit:	mov eax,1		; Code for Exit Syscall
	mov ebx,0		; Return a code of zero	
	int 80H			; Make kernel call

程式分析:
    mov edi,EditBuff //edi = EditBuff
    mov ecx,BUFFERLEN-1 //ecx= BUFFERLEN-1,這樣可以不覆蓋最後一個換行符
    mov al,FILLCHR //al = ‘#’
DoChar: stosb //用al中的值填充edi
    loop DoChar //ecx=ecx-1,如果ecx不等於0,跳轉到DoChar。

makefile檔案內容:

loopdemo: loopdemo.o
	ld -o loopdemo loopdemo.o
loopdemo.o: loopdemo.asm
	nasm -f elf -g -F stabs loopdemo.asm -l loopdemo.lst

測試:

[[email protected] loopdemo]# make
nasm -f elf -g -F stabs loopdemo.asm -l loopdemo.lst
ld -o loopdemo loopdemo.o
[[email protected] loopdemo]# ./loopdemo 
abcdefghijklm
#############

相關推薦

32組合語言學習筆記(32)--loop指令

 loop指令用ecx來控制迴圈次數,loop label,相當於如下兩條指令: dec ecx jne label 如下是使用loop指令的一個示例程式: section .data EditBuff: db 'abcdefghijklm',10 BUFFERL

32組合語言學習筆記(12)--分析switch語句的彙編程式碼

switch語句可以根據整數索引值進行多重分支選擇,程式碼的可讀性好,switch語句的彙編實現是通過跳轉表來完成的,這樣執行效率也很高。int switch_eg(int x){int result = x;switch (x) {case 100:result*= 1

32組合語言學習筆記(21)--用NASM實現Hello World小程式

前面20篇彙編學習筆記主要是學習《深入理解計算機系統》過程中所記錄的筆記,接下來打算學一下另外一本書《Assembly Language step by step programming with linux》。首先需要安裝NASM彙編器,例如:rpm –ivh nasm-2

32組合語言學習筆記(41)--fgets等函式的使用

 在《32位組合語言學習筆記(13)--函式的呼叫》曾分析過c函式的呼叫過程,對於c函式的預設呼叫約定cdecl,要求函式引數的壓棧順序是從右向左,由呼叫方來清理棧。下面示例程式會使用libc庫的幾個函式: char *fgets( char *string, int

Java學習筆記32(集合框架六:Map接口)

hashtable code rri 輸出 clas bsp pan ons spa Map接口與Collection不同: Collection中的集合元素是孤立的,可理解為單身,是一個一個存進去的,稱為單列集合 Map中的集合元素是成對存在的,可理解為夫妻,是一對一對存

C語言實例解析精粹學習筆記——32

組合 pri 結構體指針 name ber ESS tdi 筆記 string 實例32:   編制一個包含姓名、地址、郵編和電話的通訊錄輸入和輸出函數。 思路解析:   1、用結構體來完成姓名、地址、郵編和電話的組合。   2、結構體指針的使用。   3、malloc的使

python學習筆記(32) 多型和封裝

python天生支援多型  #動態強型別語言 list tuple 不崇尚根據繼承所得來的相似 如果兩個類剛好相似,不產生父類的子類的兄弟關係,而是鴨子型別 list tuple這種相似,是自己寫程式碼的時候約束的,而不是通過父類約束的 優點:鬆耦合 每個相似的類之間沒有影響 缺點:太隨意,只能靠

派生類的建構函式和解構函式(C++學習筆記 32

  引入繼承的目的:①派生類繼承了基類的成員,實現了原有程式碼的重用。②實現程式碼的擴充,只有在派生類中通過新增新的成員,加入新的功能,類的派生才有實際意義。   基類的建構函式和解構函式不能被繼承,在派生類中,如果對派生類新增的成員進行初始化,就需要加入派生類的建構函式,同時,對所有從基類

【機器學習筆記32】短時傅立葉變換

傅立葉變換的侷限性 1 需要利用訊號的全部時域資訊; 2 沒有反應頻率隨時間變換的訊號情況; 短時傅立葉變換 1964年Gabor提出了短時傅立葉變換(有叫Gabor變換),即在傳統的傅立葉變換的基礎上加了一個時間窗。如下: Sw(x,t)=∫x(τ)m(τ−

吳恩達深度學習筆記(32)-Dropout正則化Dropout Regularization

dropout 正則化(Dropout Regularization) 除了L2正則化,還有一個非常實用的正則化方法——“Dropout(隨機失活)”,我們來看看它的工作原理。 假設你在訓練上圖這樣的神經網路,它存在過擬合,這就是dropout所要處理的,我們複製這個神經網路,dr

Java學習筆記32:finally語句

package Demo_exception; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class FinallyTe

從零開始-Machine Learning學習筆記(32)-強化學習

文章目錄 1. K-搖臂賭博機 1.1 探索與利用 1.2 $\epsilon$ -貪心 1.3 Softmax 2. 有模型學習 2.1 策略評估

Linux學習筆記32——linux上搭建持續整合環境之maven及nexus倉庫

linux搭建jenkins 一、什麼是持續整合 這個做法有如下好處: 整體流程: 重要組成部分 二、安裝jdk及maven 1,安裝jdk 2,安裝maven 三、安裝Maven私服N

組合語言學習筆記(十二)-浮點指令

浮點數如何儲存 浮點數的運算完全不同於整數,從暫存器到指令,都有一套獨特的處理流程,浮點單元也稱作x87 FPU。 現在看浮點數的表示方式,我們所知道的,計算機使用二進位制儲存資料,所表示的數字都具有確定性,那是如何表示浮點這種具有近似效果的資料呢,答案是通過科學計數

Eratosthenes篩法求1——100000之間所有的素數(32組合語言

include io32.inc .dataarray byte 100001 dup(30h) .codestart:mov esi,2 ;用來記錄某數,方便以後找所有可以被其整除的數xor edi

linux學習筆記:基本指令mkdir, rmdir 、和rm

pytho mil 註意 folder 執行 dir 不同 情況 我們 #學習內容來自莫煩python mkdir 建立文件夾 mkdir (make directory) 就是創建一個文件夾的意思, 使用起來很簡單. $ mkdir folder2 如果你想在這個目錄給

Linux學習筆記之基本指令

20px rar解壓 ont 信息 bsp font -h 目錄 展示 body { background: #f4f4f4 } .title { width: 100%; background: #5cb85c; padding: 5px; font-size: 20px

學習筆記:include指令和include動作的區別 -- include動作和forward動作比較

<%@ include file =".." ...%>和<jsp:include> 1、靜態引入jsp檔案:jsp指令元素 <%@ include file="檔案路徑" %> (等於是將兩個jsp合併為一個jsp,就是將A.jsp的程式碼複製到B.

學習筆記」include指令與jsp:include動作標識的區別

1 include指令通過file屬性指定被包含的檔案,並且file屬性不支援任何表示式; <jsp:include>動作標識通過page屬性指定被包含的檔案,而且page屬性支援JSP表示式。   2 使用include指令時,被包含的檔案內容會原封不動的

Linux在64執行32程式(安裝32庫:rpm、deb)

記錄: ------------------------------------------------------------------- centos7.x 安裝了glibc:glibc-2.17-157.el7.i686 glibc-2.17 nodeps安裝,即可