Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
X86 TASM位操作_X86_Bit Manipulation_Assembly_Tasm - Fatal编程技术网

X86 TASM位操作

X86 TASM位操作,x86,bit-manipulation,assembly,tasm,X86,Bit Manipulation,Assembly,Tasm,我需要显示矩阵(3x3)中的所有数字,其中数字有两个前位。 我想我已经接近解决方案了,但有些地方出了问题,你能指出什么地方出了问题吗 .model small .stack 100h .data n equ 3 a dw n*n dup(?) .code extrn write:near extrn read:near begin: mov ax,@data mov ds,ax mov cx,n*n mov si,0 m1:

我需要显示矩阵(3x3)中的所有数字,其中数字有两个前位。 我想我已经接近解决方案了,但有些地方出了问题,你能指出什么地方出了问题吗

.model small
.stack 100h
.data
n equ 3
a dw n*n dup(?)


.code
 extrn write:near 
 extrn read:near

begin:
    mov ax,@data
    mov ds,ax
        mov cx,n*n 
    mov si,0   
m1: 
    call read
    mov a[si],ax  
    add si,2
    loop m1             

    mov si,0        
    mov cx,n*n
m2: 
    mov bx, a[si]
    test bx,1
    jz net
    test bx,2
    jz net
    mov ax,a[si]
    call write
net:
    add si,2
    loop m2

    mov ah,4ch
    int 21h
end begin

这取决于你所说的“前两位”是什么意思。如果你在寻找两个最低阶的位,那么你所写的代码可以很好地工作。即,设置位0和位1。您在注释(3、6、7)中给出的示例可能输出3和7,因为它们设置了最低阶的两位。即:

3 = 00000011 binary
6 = 00000110 binary
7 = 00000111 binary
因此,只有3和7符合您在代码中编写的条件


您似乎将“前两位”解释为数字以任何前导零后的二进制序列“11”开头。如果这真的是您想要的解释,那么您必须使用左移位指令,直到高位设置为1,然后检查下一个最高位是否设置为1。

这取决于您所说的“两个第一位设置”的含义。如果要查找两个最低阶位,您编写的代码可以正常工作。即,设置位0和位1。您在注释(3、6、7)中给出的示例可能输出3和7,因为它们设置了最低阶的两位。即:

3 = 00000011 binary
6 = 00000110 binary
7 = 00000111 binary
因此,只有3和7符合您在代码中编写的条件


您似乎将“前两位”解释为数字以任何前导零后的二进制序列“11”开头。如果这真的是您想要的解释,那么您必须使用左移位指令,直到高位设置为1,然后检查下一个最高位是否设置为1。

您看到什么症状使您认为有问题?我认为前两位的确定是错误的,因为在我输入367的地方,它只给了我其中的两个,但它们都有11作为第一位。@Viktor:是的,数字3和7。最高位位于数字的最左侧!“前两位”是指两个LSB还是MSB?投票结束时“被问得太晚了15年”。你看到了什么症状让你觉得有问题?我认为前两位的确定是错误的,因为我输入3 6 7时,只给出了其中的两个,但它们都有11个作为第一位。@Viktor:是的,数字3和7。最高位位于数字的最左侧!你说的“前两位”是指两个LSB还是MSB?投票结束时说“迟到15年”。啊。。。您可以使用test bx,0x8000来测试最高位,也可以使用bt bx,11来测试高位,如果您想找到的话。但是,如果要查找位模式“^0*11”(即查找1紧跟在最高设置位之后的数字),则需要进行一些移位。在这种情况下,您可以使用位扫描反向指令bsr cl、bx,然后测试零标志,如果设置了,则跳过扫描(因为bx=0),如果设置了dec cl,则跳过扫描,如果设置了测试符号位,则跳过扫描(因为只设置了第一位)然后是bt bx,cl来测试下一位。同意。虽然bsr指令在16位代码中不可用,这是他正在编写的。从80386 CPU和更高版本,我记得也可以在16位模式下使用!啊哈…你可以用test bx,0x8000来测试最高位或bt bx,11是的,如果你是这样的话,你可以测试高位正在尝试查找。但是,如果要查找位模式“^0*11”(即查找1紧跟在最高设置位之后的数字),则需要进行一些移位。在这种情况下,您可以使用位扫描反向指令bsr cl、bx,然后测试零标志,并跳过扫描(因为bx=0)如果设置了dec cl和测试符号位,则跳过扫描(因为只设置了第一位),如果设置了bt bx和cl,则跳过扫描以测试下一位。同意。虽然bsr指令在16位代码中不可用,这是他正在编写的。从80386 CPU和更高版本,我记得在16位模式下也可用!