小编jac*_*son的帖子

在程序集x86中查找字符串中的出现次数

我一直在研究这个程序,我必须输入一个字符串,然后在该字符串中显示字符分布.

例如:
如果输入是"minecode",则输出应为

C - 1
O - 1
D - 1
E - 2
I - 1
M - 1
N - 1

这是我试图做的,但我真的不知道如何遍历循环并检查相似的字符然后增加计数.汇编程序是在32位机器上运行的MASM 615.

.686
.MODEL flat, stdcall
.STACK
INCLUDE Irvine32.inc
.DATA
  msg0 BYTE "Enter a string of characters: ",0
  msg1 BYTE "Character Distribution: ",0
  MainArray    dword 10000 dup (?)
  UniqueChar   dword 10000 dup (?)
  CharCount    dword 10000 dup (?)
.CODE
MAIN PROC
    lea edx, msg0
    call WriteString
    call dumpregs        ; 1
    call ReadString
    mov MainArray, eax
    call …
Run Code Online (Sandbox Code Playgroud)

x86 assembly masm irvine32

3
推荐指数
1
解决办法
959
查看次数

ESP和EIP寄存器有什么区别

使用以下示例,ESP和EIP寄存器之间有什么区别?解释代码在做什么.

main PROC 
    0000 0020 call MySub 
    0000 0025 mov eax, ebx 
        .
        .
    main ENDP

MySub PROC 
    0000 0040 mov eax, edx 
        .
        .
    ret 
MySub ENDP 
Run Code Online (Sandbox Code Playgroud)

0000 0025是紧跟在CALL指令之后的指令的偏移量

0000 0040是MySub中第一条指令的偏移量

CALL指令将0000 0025推入堆栈,并将0000 0040加载到EIP中

|-------------|              |----------|
| 0000 0025   |<--ESP        | 0000 0040| EIP
|-------------|              |----------|
|             |
|-------------|
|             |
|-------------|
Run Code Online (Sandbox Code Playgroud)

RET指令从堆栈弹出0000 0025到EIP(RET执行前的堆栈显示)

|-------------|              |----------|
| 0000 0025   |<--ESP        | 0000 0025| EIP
|-------------|              |----------|
|             |
|-------------|
|             |
|-------------|
Run Code Online (Sandbox Code Playgroud)

x86 assembly procedure subroutine irvine32

-2
推荐指数
1
解决办法
1万
查看次数

标签 统计

assembly ×2

irvine32 ×2

x86 ×2

masm ×1

procedure ×1

subroutine ×1