.section .data
value1:
.byte 0x05, 0x02, 0x01, 0x08, 0x02
value2:
.byte 0x03, 0x03, 0x09, 0x02, 0x05
.section .bss
.lcomm sum, 6
.section .text
.global _start
_start:
nop
xor %edi, %edi
movl $5, %ecx
clc
loop1:
movb value1(, %edi, 1), %al #依次取得各位上的值
adcb value2(, %edi, 1), %al
aaa #调整相加后的值为不打包BCD值
movb %al, sum(, %edi, 1) #存储一次相加的结果
inc %edi #内存指针移位
loop loop1 #循环一次 %ecx 中的值减 1
adcb $0, sum(, %edi, 4) #当最高位相加时不忘加上进位值
movl $1, %eax
movl $0, %ebx
int $0x80
(gdb) info reg
eax 0x100 256
.section .data
value1:
.byte 0x02, 0x08, 0x01, 0x02, 0x07 #被除数数组
divisor:
.byte 3 #除数
.section .bss
.lcomm quotient, 5 #存放商
.lcomm remainder, 1 #存放余数
.section .text
.global _start
_start:
nop
xor %edi, %edi
movl $5, %ecx #5位被除数的商最多5个(循环5次)
loop1:
movb value1(, %edi, 1), %al
aad #调整不打包BCD到正常的二进制数
divb divisor # AH中为余数,AL中为商
cmpb $0, %al #不够除,调整
je adjust
movb %al, quotient(, %edi, 1) #保存商
inc %edi
loop loop1
movb %ah, remainder #除完,保存最后的余数
movl $1, %eax
movl $0, %ebx
int $0x80
adjust:
inc %edi #不够除,再移1位
movb value1(, %edi, 1), %al
aad
divb divisor
movb %al, quotient(, %edi, 1) #保存商
dec %ecx #循环次数-1
inc %edi #移动被除数数组指针
jmp loop1
(gdb) x/5b "ient
0x80490d0 <quotient>: 0x00 0x09 0x03 0x07 0x05
(gdb) x/5b &remainder
0x80490d5 <remainder>: 0x02 0x00 0x00 0x00 0x00
.section .data
value1:
.byte 0x25, 0x81, 0x02
value2:
.byte 0x33, 0x29, 0x05
.section .bss
.lcomm result, 4
.section .text
.global _start
_start:
nop
xor %edi, %edi
movl $3, %ecx
loop1:
movb value2(, %edi, 1), %al
sbbb value1(, %edi, 1), %al
das
movb %al, result(, %edi, 1)
inc %edi
loop loop1
sbbb $0, result(, %edi, 4)
movl $1, %eax
movl $0, %ebx
int $0x80
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |