8086汇编程序存储唯一值

2024-02-06

我一直在制作这个程序,它接受一个列表并在其中查找唯一元素并将其存储在另一个列表或寄存器中

下面的代码将主列表放入 SI 寄存器中,然后 BX 充当指针,遍历整个数组以查找相似之处...如果没有找到相似之处,则 SI 中的元素(存储在 AL 中)将存储在 DI 中。 .为了避免当 BX 到达其值的完全相同位置时可能出现的第一个相似性,我为此设置了一个标志。


uniqueElement macro list1 list2
    local loop1,comparasionLabel,checkFlag,trigger,nextElement,addElement,endAddition
    lea si,list1
    lea di,list2 
loop1:
    mov ah,00H
    mov cx,00H   ;this is an intial flag gets triggered when an initial similarity is spotted
    lea bx,list1  ; this will be the search loop which will compare each of it's elements to SI
    mov al,BYTE PTR[SI] 
    cmp al,'$'  ; since I'm using a '$' terminated string
        je endAddition
comparasionLabel:
    mov dl,BYTE PTR[BX]
    cmp dl,'$'
        je addElement
    cmp al,dl
        je checkFlag
    inc bx
    jmp comparasionLabel    
            
checkFlag:           
    cmp cx,00H    ; this is when a first similarity is spotted, the flag gets triggered here
        je trigger
    cmp cx,01H       ; or if it was already triggered and another similarity spotted, SI moves to next element
        je nextElement     
trigger:
    mov cx,01H
    inc bx
    jmp comparasionLabel
nextElement:
    inc si
    jmp loop1
addElement:
    mov ah,00h
    mov BYTE PTR [di],al
    inc di
    inc si
    jmp loop1        
        
endAddition:
    inc di
    mov ah,00H
    mov al,'$'
    mov BYTE PTR[di],al               
endm


这只是执行宏的代码

.model small
.data
list1 db 'H3llo$'    
list2 db 50 DUP [?]
.code  
mov ax,@data
mov ds,ax
uniqueElement list1 list2
mov ah,09H
mov dx,offset di
int 21h

.exit

我不知道为什么它不断打印相同的列表而不删除唯一的项目


我不知道为什么它不断打印相同的列表而不删除唯一的项目

mov ah,09H
mov dx,offset di
int 21h

错误出在印刷上。指令mov dx,offset di是不正确的!如果它会让 MASM 加载,我不会感到惊讶DX寄存器将为零,并且由于源文本位于偏移地址零,因此结果将是:

h3llo

正确的代码如下:

mov  dx, offset list2
mov  ah, 09h
int  21h

除了无关的代码之外,其余代码都是正确的inc di它在输出字符串中的终止符“$”之前引入一个垃圾字符。


下面是我对你的算法的重写,删除了很多冗余。
我采取了另一种方法,因为而不是flagging相似之处,我count火柴。每个唯一的字符都会产生一个匹配,因此只有当计数器有一个字符时,才会将字符添加到输出缓冲区CX=1.

    lea  si, list1
    lea  di, list2 
loop1:
    mov  al, [si] 
    cmp  al, '$'
    je   endAddition

    xor  cx, cx       ; Counts matches, will become at least 1
    lea  bx, list1
loop2:
    inc  bx
    mov  dl, [bx-1]
    cmp  dl, '$'
    je   maybeAddElement
    cmp  al, dl
    jne  loop2
    inc  cx
    jmp  loop2

maybeAddElement:
    cmp  cx, 1
    jne  nextElement
    mov  [di], al
    inc  di
nextElement:
    inc  si
    jmp  loop1        
        
endAddition:
    mov  [di], al      ; AL='$'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8086汇编程序存储唯一值 的相关文章

  • 从地址获取上一条指令的开头

    我们在缓冲区中查看 x86 操作码 标记当前指针 68 0F 00 6A 90 00 找到下一条指令的开始很容易 因为电流的大小是可以确定的 但是你如何才能准确地猜出前一个的开始呢 68 0F 00 6A 90 总共 5 个字节 结束于 0
  • 切换 C++ 函数的调用堆栈

    这是我的上一个问题 https stackoverflow com questions 1371547 explanation of asm code关于切换 C 调用堆栈 但是 C 使用不同的调用约定 thiscall 并且可能需要一些不
  • 处理负整数的汇编 MASM

    我被指示用汇编语言编写一个程序 该程序将执行以下算术 A B C D A E 当没有负值发挥作用时 我成功地做到了这一点 但假设 A 5 B 4 C 3 D 2 和 E 1 这给了我们 5 4 3 2 5 1 或 6 这就是我需要帮助的地方
  • 比较堆栈中的两个值? [复制]

    这个问题在这里已经有答案了 我卡住了 在我的汇编代码中 我想比较两个值 堆 x86 语法 AT T cmpl 4 ebp 4 ebp 错误 cmp 的内存引用太多 我认为不可能根据乘数和 ebp 来比较两个值 有什么建议 您可以使用 CMP
  • 使用乘法执行整数除法[重复]

    这个问题在这里已经有答案了 查看编译器生成的 x86 程序集 我注意到 无符号 整数除法有时会实现为整数乘法 这些优化似乎遵循以下形式 value n gt value 0xFFFFFFFF n 1 0x100000000 例如 除以 9
  • 链接描述文件未按预期跳过字节

    因此 我有这个汇编文件 我使用 GNU as 进行汇编 并使用链接器脚本与 GNU ld 进行链接 链接描述文件 boot ld INPUT boot o OUTPUT boot out ENTRY boot start SECTIONS
  • 我如何使其解密而不是加密?

    想知道如何从加密代码中获取此代码并使用相同的代码来创建解密 我知道这意味着我必须反转一些指令并重新排序 但我无法弄清楚哪些指令需要重新排序 哪些不需要 编辑 这是完整的函数 可以让事情变得更清晰一些 对堆栈溢出非常陌生 因此对于任何混淆表示
  • MASM32 中令人困惑的括号

    我正在尝试掌握 MASM32 但对以下内容感到困惑 我认为括号用于间接 所以如果我有预定义的变量 data item dd 42 then mov ebx item 会将 item 的内容 即数字 42 放入 ebx 中并 mov ebx
  • 自定义键盘中断处理程序

    我正在尝试编写一个简单的程序 将标准键盘中断替换为自定义的键盘中断 以减少变量 但是 如果不调用旧处理程序 它就无法工作 这是我的中断处理程序 handler proc push ax push di dec EF pushf when t
  • 不知道如何一次打印整个日历[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 cseg segment assume cs cseg ds cseg org 100H begin mov es cs video mov
  • 比较击键 - 装配 CCS64

    I want to compare keystrokes in assembly CCS64 If I type in the same key in a row I want to do something example A A do
  • MIPS 在程序中使用 $s0... 等注册并最终恢复它是否优雅

    我在 MIPS 教程中读到 只有寄存器 s0 s7 在过程调用中被保留 但我认为 也许我错了 创建有副作用的程序并不优雅 我认为程序应该只更改 v0 v1 寄存器和堆栈 如果需要的话 我是对的吗 所以我认为在我的程序中我只能使用 t0 t9
  • 用于读/写 XMM 和 YMM 寄存器的内联汇编代码?

    我有 2 个变量来模拟 X86 XMM 和 YMM 如下所示 uint64 t xmm value 2 uint64 t ymm value 4 现在我想使用内联汇编来读取和写入 XMM YMM 寄存器 如何编写GCC内联汇编来复制xmm
  • 为什么 godbolt 生成的 asm 输出与我在 Visual Studio 中的实际 asm 代码不同?

    这是生成的代码godbolt https godbolt org z 1F1t6Z 以下是 Visual Studio 在我的 main asm 文件上生成的相同代码 通过 汇编器输出 字段下的 项目 gt C C gt 输出文件 gt 使
  • 内联汇编 - cdecl 和准备堆栈

    我最近一直在尝试通过使用缓冲区和不同汇编运算符的原始十六进制等效项来实现 C 中的动态函数 为了说明一个简单的跳转 byte buffer new buffer 5 buffer 0xE9 Hex for jump uint buffer
  • x86 实模式下的段大小

    我对实模式下段的大小有一个疑问 因为它们不能超过 64K 但可以小于那个 http support microsoft com kb 120069 我的问题是这些段大小和基地址是如何初始化的 就像保护模式下有 GDT 和 LDT 一样 实模
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • elf .rel.text 部分中 R_386_32/R_386_PC32 的含义

    为了理解重定位的概念 我编写了一个简单的 chk c 程序 如下所示 1 include
  • 如何获取 VESA BIOS 信息

    我正在跟踪Phil Opp 教程 https os phil opp com 关于用 Rust 编写一个操作系统 在稍微尝试了一下之后 我想在屏幕上显示真实的图形 我发现我应该从使用带有 VESA 的线性帧缓冲区开始 我在 osdev or
  • MASM 字符串反转

    好吧 我正在讨论这个问题 可能是一个非常复杂的解决方案 但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转 源 字符串 而不使用 目标 字符串 临时变量 这是我的尝试 INCLUDE Irvine32 inc data sour

随机推荐