# An example of using BCD integer values (传送BCD值)
#
# FBLD 用于把打包80位BCD值传送到FPU寄存器堆栈中。
#
# fbld source
#
# source 是80位的内存位置
#
.section .data
data1:
.byte 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
data2:
.int 2
.section .text
.globl main
main:
nop
fbld data1
fimul data2
fbstp data1
movl $1, %eax
movl $0, %ebx
int $0x80
# gcc -g -o 06-fbld 06-fbld.s -m32
# data1 定义的内存位置创建一个表示十进制值1234的简单的BCD值。
# fbld 把这个值加载到FPU寄存器堆栈的顶部(ST0)
# fimul 把ST0寄存器和data2所在的位置中的整数值相乘。
# fbstp 把堆栈中新的值传送回data1所在的内存位置中。
gdb -q -f 06-fbld
Reading symbols from 06-fbld...
(gdb) b 20
Breakpoint 1 at 0x119e: file 06-fbld.s, line 20.
(gdb) r
Starting program: /home/06-fbld
Breakpoint 1, main () at 06-fbld.s:20
/home/06-fbld.s:20:321:beg:0x5655619e
20 fbld data1
(gdb) s
/home/06-fbld.s:21:333:beg:0x565561a4
21 fimul data2
(gdb) x/10b &data1
0x56559008: 52 18 0 0 0 0 0 0
0x56559010: 0 0
(gdb) x/10bx &data1
0x56559008: 0x34 0x12 0x00 0x00 0x00 0x00 0x00 0x00
0x56559010: 0x00 0x00
(gdb) i all
st0 1234 (raw 0x40099a40000000000000) // 1234被转换成浮点数
(gdb) s
/home/06-fbld.s:22:346:beg:0x565561aa
22 fbstp data1
(gdb) i all
st0 2468 (raw 0x400a9a40000000000000)
(gdb) s
/home/06-fbld.s:24:360:beg:0x565561b0
24 movl $1, %eax
(gdb) x/10bx &data1
0x56559008: 0x68 0x24 0x00 0x00 0x00 0x00 0x00 0x00
0x56559010: 0x00 0x00