我正忙于一项单一任务,涉及使用x86架构使用nasm创建一个小程序。我正在使用虚拟桌面(Windows XP,32位)。我们只允许使用通用寄存器ax,bx,cx,dx指针寄存器si,di。
我知道这不是获得作业帮助的地方,因此我不会要求解决我的问题,而是要解释一些事情。
我需要取一串十六进制数字,即。 num1: db 06h,06h,06h,06h,06h,06h,06h
(我假设这是正确的)。基本上这个十六进制字符串代表一个放大的数字。在这种情况下,每个十六进制是一个位模式(每个0将打印一个空格,每个打印一个$),对于每个新的十六进制,我们移动下一行并再次开始打印。我知道这将通过循环完成,我将尝试自己解决这个问题。我似乎无法弄清楚这是一个有点模式的整个概念。
一个更简单的例子如下:让我们说num1: 06h,06h,06h
第一个问题:我说的是num1包含3个字节(或者是6个)
对于每个十六进制数,都有一个等效的位模式(在这种情况下为00000110)
我想将十六进制数06h
移动到寄存器中,然后逐步执行其位模式。我怎么做到这一点,我使用调试来完成以下代码,并且bx寄存器有一些奇怪的十六进制值,这意味着我显然不理解这一点,
; code
bits 16
org 0x100
jmp main
num1: db 06h,06h,06h
main:
mov ax,num1
mov si,ax ;points to address
mov cx,8 ;loop counter
loop_1:
mov bx,[si] ;I assumed this would get the first bit (0) in this case
... compare to 0 or 1 and print etc...
inc si
loop loop_1
int 20h
bx寄存器的十六进制值与我认为应该具有的值不对应。
我迷路了;我试图遍历一点模式而且我不知道我是否真的遍历了一点模式或者是什么。他们已经陷入了沉重的境界,在理解方面没有任何帮助。我不想要代码人员,我只想了解十六进制发生了什么,以及pc如何看待它,以及它如何存储在寄存器中。哦,如果我可以使用指针寄存器si逐步通过位模式来获取每次的实际位。
对不起,如果这听起来很愚蠢,我已经尝试过阅读,那里有太多的内容,没有什么特别针对我正在寻找的内容。我是大会的新人,第一个程序曾经大声笑。我已经想到了c ++中的伪代码,但转换为汇编是另一天的另一个故事!