linux-AT&T彙編,把32位寄存器的值以16進制字符串打印出來

將寄存器的值以16進制顯示,程序如下:

.section .bbs
.lcomm buf,10 #定義一個10字節長度的內存區,用來儲存計算出來的字符

.section .text
.globl _start
_start:
//初始化寄存器
movl $0x01abcdef,%eax #將需要轉換的值存入eax
movl $0,%edi
movl $0x0000000f,%edx
//寫入‘0X’
movl $0x30,(buf)
movl $0x58,(buf+1)

//循環計算字符
loop_ascii:
movl %eax,%ebx
imul $4,%edi,%ecx
and %edx,%ebx
ror %cl,%ebx
cmpb $10,%bl
jnc max9
addb $0x30,%bl
jmp fun
max9:
addb $0x37,%bl
fun:
rol $4,%edx
movl $9,%ecx
sub %edi,%ecx
movb %bl,buf(,%ecx,1)
cmp $7,%edi
jnc print
inc %edi
jmp loop_ascii

//輸出
print:
movl $1,%ebx
movl $4,%eax
movl $buf,%ecx
movl $10,%edx
int $0x80
//退出程序
movl $0,%ebx
movl $1,%eax
int $0x80

運行結果如下:


彙編程序與其他高級編程語言的編程思路不同,所以如果純粹用函數編程的思想反而會搞得很麻煩,例如:

/*計算以下方程式:x=5
*y=2*x,x>=4
*y=1+x,x<4
*將值存入ebx
*/
.section .text
.globl _start
_start:
movl $5,%ebx #初始化ebx
cmp $4,%ebx #比較ebx的值
jnc fun1 #如果ebx大於等於4,就跳轉到標號fun1處,計算2*ebx
addl $1,%ebx  #否則計算1+ebx
jmp exit #如果沒有這句話,程序會接着執行fun1的語句,所以儘量不要把標號看作函數名來使用

fun1:
imul $2,%ebx,%ebx 
//退出程序,返回值爲ebx中的值
exit:
movl $1,%eax
int $0x80

運行結果:


下圖可以直觀反映該程序的結構:


系統會從1開始依次向後執行,遇到跳轉語句時跳轉到指定的位置,接着向後執行,標號並不反映在執行程序中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章