小编Fif*_*nik的帖子

在 Assembly (x86) 中添加 2D 数组

我必须添加两个 3*3 的单词数组并将结果存储在另一个数组中。这是我的代码:

.data 
a1 WORD 1,2,3
   WORD 4,2,3
   WORD 1,4,3

a2 WORD 4, 3, 8
   WORD 5, 6, 8
   WORD 4, 8, 9

a3 WORD DUP 9(0)
.code
main PROC
    mov eax,0;
    mov ebx,0;
    mov ecx,0;
    mov edx,0;
    mov edi,0;
    mov esi,0;
    mov edi,offset a1
    mov esi,offset a2
    mov ebx, offset a3
    mov ecx,LENGTHOF a2

    LOOP:
    mov eax,[esi]
    add eax,[edi]
    mov [ebx], eax
    inc ebx
    inc esi
    inc edi

    call DumpRegs
    loop LOOP

    exit
main ENDP

END main
Run Code Online (Sandbox Code Playgroud)

但这是 …

arrays x86 assembly

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

使用 ah = 2Ch 的 int 21h 延迟程序

我正在为学校的程序集 8086(使用 DOSBox)开发一个项目,我试图将我的程序延迟 0.5 秒。

我尝试创建一个循环,将当前时间与初始时间进行比较,使用 int 21h、函数 2Ch 和 中的百分之一值DL,但它似乎太慢了......

mov ah, 2Ch
int 21h
mov al, dl ;hundredths
mov bx, 0
wait_loop:
    one_hun:
        int 21h
        cmp al, dl
        je one_hun
    mov al, dl
    inc bx
    cmp bx, 50
    jne wait_loop
Run Code Online (Sandbox Code Playgroud)

assembly delay dosbox x86-16

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

如何确定寄存器是从右到左加载,反之亦然

在查看gdb输出并查看汇编调用时,通常我可以找到一个使用硬编码值的命令来确定寄存器是从右到左加载,反之亦然.

通常类似于以下内容:

  sub     rsp, 16
Run Code Online (Sandbox Code Playgroud)

要么

  sub     16, rsp 
Run Code Online (Sandbox Code Playgroud)

但有时候,没有像上面这样的值可见.我所看到的只是如下调用:

(gdb) disassemble
 Dump of assembler code for function main:
 0x0000000100000f54 <main+4>:    mov    $rdi,%r15
 0x0000000100000f59 <main+9>:    mov    $rsi,%r14
 0x0000000100000f60 <main+16>:   mov    $rdx,%r13
 0x0000000100000f67 <main+23>:   mov    $ecx,$r12d
 End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

如何确定值是从左向右处理还是从右处理?

x86 assembly cpu-registers att intel-syntax

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

如何通过AND操作获得SF = 1?

是否可以使用这些指令获得等于1的符号标志?

movzx ecx, byte ptr[eax]
and ecx, 8000000Fh
jns short loc_401073
Run Code Online (Sandbox Code Playgroud)

寄存器和8000000Fh and之间有一个ecx.In ecx可以是00h-FFh范围内的数字,但我不确定是否可以得到SF = 1.有人能帮助我吗?

x86 assembly flags disassembly

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

如何使用 1 寻址模式通过加载在汇编中添加两个存储值?

我想添加两个存储的值 x 和 y 但我只想使用 1 寻址模式。
以下是示例:

lda x
sta x
// store the final result in x


lda y
sta y
// store the final result in y

//now I want to add x and y like x+y. Is the following pattern correct? whats wrong? 
lda x
lda y
add x
sta x
Run Code Online (Sandbox Code Playgroud)

assembly 6502

2
推荐指数
2
解决办法
3895
查看次数

我可以在TASM中将al推入堆栈吗?

我是集会的初学者,任何帮助将不胜感激.这是我的代码:

.MODEL SMALL

.DATA  
Textstring db "I'm a string$"
.CODE
START:

mov dx, Textstring
push dx
getche:
    mov ah, 06h
    int 21h
    push al



 END START
Run Code Online (Sandbox Code Playgroud)

我一直得到操作数类型在第8行上不匹配的错误,操作或指令的参数在第13行上有非法大小.
我猜测问题是我试图推进AL堆栈.无论如何我可以把内容推AL到堆栈上吗?我正在尝试创建一个代码,我提示用户输入一个字符并将该字符返回给调用它的程序.

assembly dos tasm x86-16

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

bp寄存器在基于索引时不起作用

这是我编写的代码,用于以相反的顺序将数据从一个数组移动到另一个数组.

data segment
arr1 db 10h,20h,30h,40h
arr2 db 4 dup(0)
cnt dw 04h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea si,arr1
lea di,arr2
mov cx,cnt
mov bp,cx
mov bx,00h
back:
mov dl,[si][bx]
mov [di+bp-1],dl
dec bp
Run Code Online (Sandbox Code Playgroud)

上面的这行代码(bp寄存器)没有加载我希望用基于索引寻址的内存.

inc bx
loop back
mov ah,4ch
int 21h
code ends
end start
Run Code Online (Sandbox Code Playgroud)

assembly masm x86-16

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

在程序RET之后,汇编x86无限循环问题MOV CX,12

NUM EQU 3
.MODEL small
.STACK
.DATA
    tempi DW 8,27,17,12,21,34,9,41,7,18,15,5
    risultato DW NUM DUP (?)
.CODE
.STARTUP
    PUSH OFFSET tempi
    PUSH OFFSET risultato
    CALL copiaVettore
    ADD SP,4
    MOV CX, 0
    MOV CX,12
    LEA BX, risultato
salta:
    MOV DX, [BX]
    ADD DX, 30h
    ADD BX, 2 
    MOV AH, 2h
    INT 21h
LOOP salta
.EXIT
 copiaVettore PROC
    PUSH BP 
    MOV BP, SP
    PUSH DI
    PUSH SI

    MOV DI, [BP+4] ;risultato
    MOV SI, [BP+6] ;sorgente    
    MOV CX, 12
    ciclo1: 
        MOV AX, [SI]
        MOV …
Run Code Online (Sandbox Code Playgroud)

assembly x86-16 emu8086

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

如何用汇编语言读取命令行参数?

我正在使用TASM汇编程序,我似乎找不到保存命令行参数甚至输出它们的方法.我试图做int 21hdx=0081hah=09h.它没有做任何事情,虽然我已经读到它是这样做的方式.

我添加了我认为应该复制的代码并显示我输入的参数:

mov dx, 81h
mov ah, 09h
int 21h
Run Code Online (Sandbox Code Playgroud)

assembly dos tasm command-line-parsing x86-16

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

如何加快这种插入排序?(C中的内联汇编)

因此,此插入排序是用x86编写的,但嵌入在C中。它还具有一个标志,在对数组的一半进行排序后,我们将其设置为保留。有什么办法可以提高性能?

void asmInsSort(int *list, int arrayLen, int halfpoint) {
 _asm
 {

    mov ecx, arrayLen
    mov esi, list
    mov ebx, halfpoint
    mov eax, 0

    more:
        cmp ecx, 0              // Compare current arrayLen w/ 0
            je  done            // If it is equal, we are done
        mov edi, eax            //J = I
        push eax                //push eax (i) to free up register for key
        mov eax, [esi + edi]    //Key = Array[i] technically j
        sub edi, 4              //J - 1
        mov edx, arrayLen       //K …
Run Code Online (Sandbox Code Playgroud)

x86 assembly inline-assembly micro-optimization insertion-sort

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