x86-16相关内容
我有这个代码,我想问一下如何读取它,以了解程序到达第24行后AX内部的值是什么 在循环内,当 MOV AX,[SP+4d] 它会改变AX的值吗?到SP+4 我知道在节目结束时,斧头是15的六角形,只是想知道为什么? 非常感谢 推荐答案 可能您的老师喜欢欺骗您? mov ax, [sp + 4d]和mov [sp + 4d], ax指令不可编码(*)。它们的语法是错误的,因为SP寄存器
..
也许有人能帮我。我正在尝试打印与用户输入的数量相同的“”。所以我需要把字符串转换成数字。我尝试在循环中执行,但遇到一些问题,我的代码不能正常工作,它打印了65535‘’基本上这是最大值。也许有人能解释一下我的问题出在哪里? .MODEL small .STACK 200h .DATA input DB 4, ? , 4 dup (?) Symbol DB '*$' .CODE S
..
我在编写这段代码时遇到了麻烦。有没有人能给我个解决方案(我懂BCD数字,等等,我就是写不出能用的代码)? 它应该将两个打包的BCD数相加(每个4位;它们位于地址op1和op2),并将结果放入地址res。 提前感谢:) 推荐答案 使用daa(加法后小数调整),您可以直接将它们相加,而不需要往返于二进制整数。 类似的东西(完全未经测试) mov al, [OP1] ad
..
我正在编写一个程序,将多个小写字母转换为其等效的大写字母。 例如,我想要的输出是: Input a letter: asddf The uppercase equivalent of letter asddf is ASDDF 但它只获取并打印最后一个字符,如下所示: Input a letter: asddf The uppercase equivalent
..
使用以下代码片段在EMU8086上进行测试: MOV CX, 1527H SUB CX, 44H 仿真器显示AF为0 1527 - 44 ======== 14E3 手工做减法时,我们得到7-4=3,这里没有问题。 然后2-4,然后我们不得不向下一小块借钱。因此,根据我的理解,AF应该是1。 推荐答案 AF是根据从第3位到第4位的进位(或借用)设置的。
..
我目前正在开发一个bios引导加载程序,我是汇编语言的新手。我一直在阅读它,我了解它的工作原理,但有些事情涉及到我的汇编语言代码的执行顺序,我不理解。 那么基本上我的subrouteprint是如何被调用的,即使我没有调用它。 第二,它如何分配bios幻数,如果它一直位于文件的末尾,即使我没有到达。 如有任何帮助,我将不胜感激,谢谢。 [ORG 0000:7C00] global
..
如果我的MUL bxbx包含任何值,则结果将在dx和ax之间拆分,那么我如何使用该结果? 我认为使用eax可以修复它,但不行,因为我们无法访问16个高位。 我们可以声明32位变量,但如何使用它? 推荐答案 这里有一个很好的解释: https://www.tutorialspoint.com/assembly_programming/assembly_arithmeti
..
physical address=16*selector+offset 但我不知道为什么要用16乘以选择器? 推荐答案 为了与Z80“程序员兼容”,但仍能使用超过64 KiB的内存,早期的英特尔处理器引入了内存分段。在添加到16位偏移量之前,16位段将左移4位(意思是乘以16,不是64),从而得到20位地址。 对于习惯于Z80的程序员来说,所需要的只是使用操作系统提供的段,他们将能
..
我希望能够使用正常的ASM功能将某些值推送到堆栈。 例如 push ax push bx push cx push dx 我希望使用堆栈框架以任何顺序访问它们。 假设我想按C、B、A、D的顺序弹出这些,而不是只需要做... pop dx pop cx pop bx pop ax 使用SP/BP执行此操作的最佳/最有效方法是什么,这样我就可以在需要的时候抓取东西,而不
..
如果我想跳过字符串开头的所有空格,并在代码到达字符串的第一个符号时开始处理字符串,我应该编写什么循环。如果我有一个类似 的字符串 a=' s o m e word' 代码应在到达“%s”时启动。它应该是某种循环,但我仍然不知道如何正确编写它。 我的尝试: mov si, offset buff+2 ;buffer mov ah, [si]
..
我正在尝试编写汇编代码8086我有两个大小为10的数组X和Y,我想输入一个数字并检查其正y是否为1,如果为负则为0 但我的代码只显示了我输入的数字,但我希望它像这个例子一样。 示例: X : 2 -5 -7 8 -4 9 11 -12 90 -50 Y : 1 0 0 1 1 0 1 1 0 1 0 我写道: .MODEL SMALL .DATA x db 10 dup
..
推送到完整堆栈的物理后果是什么 令人惊讶的是,当只为堆栈分配2个字节[1个字]并将三个字推入不同的寄存器时,这一过程没有任何错误 推送第二项时,我应该怎么说堆栈内容 下面是堆栈段定义: Stack_segment_name segment para stack db 2 dup(0) ;define your stack segment Stack_segment_name ends
..
我正在使用emu8086。我有一个问题,这个问题让我在从六进制输入转换后,在七个分段显示器上显示我们看到的内容。我应该用十六进制输入我的数据,如果它与七段表的十六进制输入相匹配,它会显示十进制数,例如。3FH=0,06H=1。我使用数组来实现这个程序。以下是工作源程序: ORG 100H MOV AL,[1840H] ;input in this memory locatio
..
我已经学习了编译器和汇编语言,所以我想编写自己的汇编器作为练习。但我有几个问题; 如何计算@DATA或LIKE OFFSET/ADDR VARA等段的地址? 以一个简单的汇编程序为例: .model small .stack 1024 .data msg db 128 dup('A') .code start:
..
我正在用汇编语言8086处理器编写程序,但我有一个疑问。我想将一个单词移到我创建的字符串中,但汇编程序显示错误:error A2004: constant value too large。 声明: Fich db 'menu.txt',0 执行此操作: mov Fich,'menu.txt' 推荐答案 在8086汇编程序中,不能使用mov语句将字节字符串移动到内
..
我在启动时显示了displayChar字符。现在如何添加WriteHexBytes,然后在循环中使用WriteHexByte和WriteHexWord将其显示在屏幕上。 *WriteHexByte 需要8位寄存器 通过调用 ConvertHexNibble和使用 WriteChar *WriteHexWord 需要16位寄存器或内存 参数,并显示每个字节 通过调用WriteHexByt
..
我在查看二进制搜索程序代码时遇到了以下语句 l1: mov si,low_ cmp si,high_ 为什么需要存储Low_In Si,然后与HIGH_进行比较? 我们不能直接将cmp low_,High_ 推荐答案 您不能写入cmp low_, high_。 对于此类问题,请始终参考官方说明,例如https://www.felixcloutier.com/x8
..
我觉得问一些看起来很容易查找的问题很愚蠢,但正如你可能猜到的那样,搜索段落会得到很多与我想知道的无关的结果。 这几天我一直在学习汇编(编写一个很小的引导加载器,诸如此类的练习),我看到了一些对称为段落的内存块的引用。我有一个遥远的记忆,一个段落是两个词,但我真的不确定。究竟什么是段落,它的意义是什么? 推荐答案 一个段落有16个字节。它主要与x86实数模式有关(如果不是唯一的),
..
%1 我应该在8086汇编语言中做这个练习 * *** ***** ******* ********* 但作为输出,我只得到第一个星号。问题出在哪里? 他们告诉我用POP和PUSH,但没有学习过,我不知道怎么做。我希望有人能给我一个有效的帮助来解决这个代码。我还在DOSBOX上编写代码,这是我的代码: .MODEL SMALL .STACK .DAT
..
我对堆栈段(Ss)和堆栈指针(Sp)寄存器有一点困惑。 当堆栈为空时,sp值是否等于ss值? 我读到,当我们把一个字(2字节)压入堆栈时,sp递减2,如果第一个语句为真(sp=ss),那么我可以说如果堆栈不为空,堆栈指针的值总是小于或等于堆栈段的值这是真的吗?? 如果我们将一个值影响到sp,使其大于ss,会发生什么??即: MOV SS,200小时 移动SP,400h MOV AX,1010h 推
..