PUTAX函数

我从三年多以前的初二下半学期了解接触到这门技术开始,就一直都热衷于研究汇编语言了(而且尤其是x86)。看周荷琴教授的《微机原理与系统》视频课程(链接),我发现在第22集有教了一个以四位十六进制数输出通用寄存器的值的子程序。尽管不清楚到底她说的是从哪本“外国的书”上找来的(我还没有考证过),但是反正然而我还有一种更加优化的写法,在那个基础上改了一下,可以节省几个字节的机器码!

	cli
	xor ax, ax
	mov ss, ax
	mov es, ax
	mov sp, 0x7c00
	mov ax, 23456 ;随便一个什么值
	call put_ax_hex
	hlt

put_ax_hex:
	push cx
	mov cx, 0x405
	dec cx ;清零AF标志位
put_ax_hex_loop:
	rol ax, cl
	push ax
	aaa
	jnc put_ax_hex_0_to_9
	add al, 17 ;数位是A到F,加17“修正”(要注意不再是加7了,因为AAA指令本身就会减10修正一遍的)
put_ax_hex_0_to_9:
	add al, 48
	mov ah, 14
	int 16
	pop ax
	dec ch
	jnz put_ax_hex_loop
	pop cx
	ret
	times 510-($-$$) db 0
	dw 0xaa55

不信就把这个扇区作为MBR启动,你就会发现正确地输出了23456的十六进制:5BA0。注意由于我在前面cli了,所以这里hlt指令过后CPU就是真的停下来了的。

不会有人连编译方法都不会吧,那应该是完全没学过这个汇编语言。直接nasm a.nas -o a.hex什么的就好了啊。或者就用《30天》那本书里面的nask也是一样兼容的:nask a.nas a.hex